內建註釋

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