內建註釋
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);
}