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已随着时间而改变:

  • 在Java 5中,这意味着带注释的方法必须重写超类链中声明的非抽象方法。

  • 从Java 6开始,可以确保带注释的方法实现在类超类/接口层次结构中声明的抽象方法。

(在将代码反向移植到Java 5时,这有时会引起问题。)

@已弃用

这会将方法标记为不推荐使用。可能有几个原因:

  • 该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

由于类型擦除,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);
}