内置注释
Java 标准版附带了一些预定义的注释。你不需要自己定义它们,你可以立即使用它们。它们允许编译器对方法,类和代码进行一些基本检查。
@覆盖
此批注适用于方法,并表示此方法必须覆盖超类的方法或实现抽象超类的方法定义。如果此批注与任何其他类型的方法一起使用,编译器将抛出错误。
具体的超类
public class Vehicle {
public void drive() {
System.out.println("I am driving");
}
}
class Car extends Vehicle {
// Fine
@Override
public void drive() {
System.out.prinln("Brrrm, brrm");
}
}
抽象类
abstract class Animal {
public abstract void makeNoise();
}
class Dog extends Animal {
// Fine
@Override
public void makeNoise() {
System.out.prinln("Woof");
}
}
不起作用
class Logger1 {
public void log(String logString) {
System.out.prinln(logString);
}
}
class Logger2 {
// This will throw compile-time error. Logger2 is not a subclass of Logger1.
// log method is not overriding anything
@Override
public void log(String logString) {
System.out.println("Log 2" + logString);
}
}
主要目的是捕获错误输入,你认为自己覆盖了一个方法,但实际上是在定义一个新方法。
class Vehicle {
public void drive() {
System.out.println("I am driving");
}
}
class Car extends Vehicle {
// Compiler error. "dirve" is not the correct method name to override.
@Override
public void dirve() {
System.out.prinln("Brrrm, brrm");
}
}
请注意,@Override
的含义随时间而变化:
- 在 Java 5 中,它意味着带注释的方法必须覆盖超类链中声明的非抽象方法。
- 从 Java 6 开始,如果带注释的方法实现了在类超类/接口层次结构中声明的抽象方法,则也会感到满意。
(将代码反向移植到 Java 5 时,这偶尔会导致问题。)
@Deprecated
这会将该方法标记为已弃用。这有几个原因:
-
API 存在缺陷,修复起来不切实际,
-
使用 API可能会导致错误,
-
API 已被另一个 API 取代,
-
API 已过时,
-
API 是实验性的,并且会受到不兼容的更改,
-
或以上的任何组合。
弃用的具体原因通常可以在 API 的文档中找到。
如果使用注释,注释将导致编译器发出错误。IDE 也可能以某种方式强调此方法为已弃用
class ComplexAlgorithm {
@Deprecated
public void oldSlowUnthreadSafeMethod() {
// stuff here
}
public void quickThreadSafeMethod() {
// client code should use this instead
}
}
@SuppressWarnings
几乎在所有情况下,当编译器发出警告时,最合适的操作是修复原因。在某些情况下(例如,使用非类型安全的预泛化代码的泛型代码),这可能是不可能的,并且最好抑制那些你期望且无法修复的警告,这样你就可以更清楚地看到意外警告。
此注释可以应用于整个类,方法或行。它将警告类别作为参数。
@SuppressWarnings("deprecation")
public class RiddledWithWarnings {
// several methods calling deprecated code here
}
@SuppressWarning("finally")
public boolean checkData() {
// method calling return from within finally block
}
最好尽可能地限制注释的范围,以防止意外警告也被抑制。例如,将注释的范围限制为单行:
ComplexAlgorithm algorithm = new ComplexAlgorithm();
@SuppressWarnings("deprecation") algoritm.slowUnthreadSafeMethod();
// we marked this method deprecated in an example above
@SuppressWarnings("unsafe") List<Integer> list = getUntypeSafeList();
// old library returns, non-generic List containing only integers
此注释支持的警告可能因编译器而异。JLS 中仅特别提到了 unchecked
和 deprecation
警告。无法识别的警告类型将被忽略。
@SafeVarargs
由于类型擦除,void method(T... t)
将转换为 void method(Object[] t)
,这意味着编译器并不总是能够验证 varargs 的使用是否类型安全。例如:
private static <T> void generatesVarargsWarning(T... lists) {
有些情况下使用是安全的,在这种情况下,你可以使用 SafeVarargs
注释来注释方法以抑制警告。如果你的使用也不安全,这显然会隐藏警告。
@FunctionalInterface
这是用于标记 FunctionalInterface 的可选注释。如果编译器不符合 FunctionalInterface 规范(有一个抽象方法),它将导致编译器抱怨
@FunctionalInterface
public interface ITrade {
public boolean check(Trade t);
}
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}