Annotation
Annotation,中文稱為標註。
Annotation主要用於檢查。
三種Annotation
用 @ 開頭。
- @Override 覆寫父類別方法。
- @Deprecated 類別或方法已棄用。
- @SuppressWarnings 抑制編譯器警告。
@Override
@Override錯誤
@Override只能用在方法。
即便不寫@Override,編譯器也會自動判斷是覆寫方法。
寫了@Override,編譯器會去檢查父類別是否有這個方法,如果父類別沒這個方法,是@Override錯誤。
父類別
1
2
3
4
5
6
7
8
class Father {
void method1() {
System.out.println("Father method1");
}
void method2() {
System.out.println("Father method2");
}
}
子類別
1
2
3
4
5
6
7
8
class Child extends Father {
// 此處是@Override錯誤,父類別根本沒有method3()
@Override
void method3() {
this.method2();
System.out.println(this.hobby);
}
}
@Override原始碼
@interface 代表是一個Annotation。
@Target 只能用在方法 METHOD
1
2
3
4
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Deprecated
代表已棄用,但不代表不能用,是不推薦使用。
在類別或方法、屬性上面加上@Deprecated
1
2
3
4
5
6
7
8
9
@Deprecated
class Test1 {
@Deprecated
String name;
@Deprecated
public void method() {
}
}
@Deprecated原始檔
- @Documented 可用於Java Doc文件上。
- @Target 可用於建構子、屬性、區域變數、方法、package、模組、參數、類型
1
2
3
4
5
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
}
@SuppressWarnings 抑制警告
以下紅框的部分就是警告。
加上以下標註,就沒有警告了。
@SuppressWarnings({"all"})
({"??"})裡面可以填寫什麼呢?
- all,抑制所有警告
- boxing,抑制拆箱/裝箱的警告
- cast,抑制強制轉型的警告
- dep-ann,抑制棄用註釋的警告
- deprecation,抑制棄用的警告
- fallthrough,抑制與 switch 陳述式中遺漏 break 相關的警告
- finally,抑制finally 區塊相關的警告
- hiding,抑制與隱藏變數的區域變數相關的警告
- incomplete-switch,抑制與 switch 陳述式 (enum case) 中遺漏項目相關的警告
- javadoc,抑制與 javadoc 相關的警告
- nls,抑制與非 nls 字串文字相關的警告
- null,抑制與空值分析相關的警告
- rawtypes,抑制raw 類型相關的警告
- resource,抑制與使用 Closeable 類型的資源相關的警告
- restriction,抑制與使用不建議或禁止參照相關的警告
- serial,抑制與序列化相關的警告
- static-access,抑制與靜態存取不正確相關的警告
- static-method,抑制與可能宣告為 static 的方法相關的警告
- super,抑制與置換方法相關但不含 super 呼叫的警告
- synthetic-access,抑制與內部類別的存取未最佳化相關的警告
- sync-override,抑制因為置換同步方法而遺漏同步化的警告
- unchecked,抑制沒有檢查的警告
- unqualified-field-access,抑制與欄位存取不合格相關的警告
- unused,抑制沒有使用的警告
把滑鼠移到警告的黃色線,會提示Raw use,因為不知道List裝的是什麼類型。
填上rawtypes,警告馬上變成綠色。
把滑鼠移到警告的黃色線,會提示unchecked,沒有檢查類型。
填上unchecked,警告馬上變成綠色。
程式碼
1
2
3
4
5
6
7
8
public class Test {
@SuppressWarnings({"rawtypes", "unchecked"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("adfd");
list.add("cccc");
}
}
SuppressWarnings原始碼
1
2
3
4
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value(); // 是陣列,可以傳入rawtypes,unchecked,unused...等等
}
描述標註的標註
@Retention 標註的保留
1
@Retention(RetentionPolicy.SOURCE)
RetentionPolicy是列舉enum,有下面三種。
- SOURCE 程式碼編譯完,就會清掉程式碼中的標註。
- CLASS 編譯完後,程式碼仍保留標註在.class,但執行時,就會清掉。
- RUNTIME 執行時,標註仍保留在class物件中,可通過反射找到標註。
下圖中,1與2是標註被清掉的位置。
@Target
標註使用的位置,可以是建構子、屬性、區域變數、方法、package、模組、參數、類型TYPE。
TYPE可以為類別、介面、enum列舉…等等。
1
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
@Documented
可在Java Doc顯示出來標註。