Java 8 引入 JSR 308,將註解使用位置從「聲明處」擴展至「類型使用處」。配合 Checker Framework,可在編譯期檢測空指針、並發、正則等運行時錯誤。本文系統解析類型註解語法、核心價值、工具鏈與實戰應用。
Java 5~7 註解僅能用於聲明:類、方法、欄位、參數。Java 8 允許註解出現在**任何類型使用位置**:
// 建構子調用
new @Interned MyObject();
// 強制類型轉換
myString = (@NonNull String) str;
// implements 子句
class UnmodifiableList<T> implements @Readonly List<@Readonly T> { }
// throws 子句
void monitor() throws @Critical TemperatureException { }
// 泛型類型參數
List<@NonNull String> list = new ArrayList<>();
/*@NonNull*/ 註釋形式相容 Java 5/6/7Collections.emptyList().add("One"); // UnsupportedOperationException
Integer.parseInt("hello"); // NumberFormatException
System.console().readLine(); // NullPointerException
這些錯誤在傳統開發中只能靠測試發現,類型註解 + 靜態分析可在**編譯期**攔截。
# Maven 依賴# 編譯時啟用 Nullness 檢查器 javac -processor org.checkerframework.checker.nullness.NullnessChecker MyClass.java org.checkerframework checker-qual 3.40.0
import org.checkerframework.checker.nullness.qual.*;
public class Demo {
void sample() {
@NonNull Object ref = new Object(); // 通過
@NonNull Object ref2 = null; // 編譯錯誤: [assignment.type.incompatible]
}
}
/*@NonNull*/ Object ref = null; // Java 5/6/7 也能被 Checker Framework 識別
| 檢查器 | 註解 | 檢測目標 |
|---|---|---|
| Nullness | @NonNull, @Nullable | 空指針解引用 |
| Regex | @Regex, @Pattern | 正則表達式語法、匹配失敗 |
| Lock | @GuardedBy, @Holding | 並發鎖使用錯誤 |
| Tainting | @Tainted, @Untainted | 不可信資料流向敏感操作 |
| Units | @m, @kg, @s | 物理單位運算錯誤 |
| Signature | @FullyQualified, @ClassName | 字串類名/方法簽名格式 |