Java内置注释
示例
Java标准版附带了一些预定义的注释。您不需要自己定义它们,您可以立即使用它们。它们使编译器能够对方法,类和代码进行一些基本检查。
@Override
此注释适用于方法,并说此方法必须重写超类的方法或实现抽象超类的方法定义。如果将此批注与任何其他类型的方法一起使用,则编译器将引发错误。
混凝土超类
public class Vehicle { public void drive() { System.out.println("I am driving"); } } class Car extends Vehicle { //精细 @Override public void drive() { System.out.prinln("Brrrm, brrm"); } }
抽象类
abstract class Animal { public abstract void makeNoise(); } class Dog extends Animal { //精细 @Override public void makeNoise() { System.out.prinln("Woof"); } }
不起作用
class Logger1 { public void log(String logString) { System.out.prinln(logString); } } class Logger2 { //这将引发编译时错误。Logger2不是Logger1的子类。 //日志方法不覆盖任何内容 @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已随着时间而改变:
在Java5中,这意味着带注释的方法必须重写超类链中声明的非抽象方法。
从Java6开始,还可以确保带注释的方法实现在类超类/接口层次结构中声明的抽象方法。
(在将代码反向移植到Java5时,这有时会引起问题。)
@已弃用
这会将方法标记为不推荐使用。可能有几个原因:
该API有缺陷,无法修复,
使用API可能会导致错误,
该API已被另一个API取代,
该API已过时,
该API是实验性的,可能会发生不兼容的更改,
或以上的任何组合。
弃用的具体原因通常可以在API文档中找到。
如果使用注释,则该注释将导致编译器发出错误。IDE也可能以某种方式突出显示此方法,
class ComplexAlgorithm { @Deprecated public void oldSlowUnthreadSafeMethod() { //这里的东西 } public void quickThreadSafeMethod() { //客户代码应改用此代码 } }
@SuppressWarnings
在几乎所有情况下,当编译器发出警告时,最适当的措施是解决原因。在某些情况下(例如,使用非类型安全的预泛型代码的泛型代码),这可能是不可能的,并且最好抑制那些您期望且无法修复的警告,这样您就可以更清楚地看到意外警告。
该注释可以应用于整个类,方法或行。它以警告类别作为参数。
@SuppressWarnings("deprecation") public class RiddledWithWarnings { //几种方法在这里调用不赞成使用的代码 } @SuppressWarning("finally") public boolean checkData() { //从finally块中调用return的方法 }
最好尽可能地限制注释的范围,以防止意外警告也被抑制。例如,将注释的范围限制为单行:
ComplexAlgorithm algorithm = new ComplexAlgorithm(); @SuppressWarnings("deprecation") algoritm.slowUnthreadSafeMethod(); //我们在上面的示例中将此方法标记为不推荐使用 @SuppressWarnings("unsafe") List<Integer> list = getUntypeSafeList(); //旧库返回,非通用列表,仅包含整数
此注释支持的警告可能因编译器而异。JLS中仅特别提及unchecked和deprecation警告。无法识别的警告类型将被忽略。
@SafeVarargs
由于类型擦除,voidmethod(T...t)将转换为voidmethod(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); }