内置注释

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 中仅特别提到了 uncheckeddeprecation 警告。无法识别的警告类型将被忽略。

@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);
}