| 修飾對象 | 語義 | 典型場景 |
|---|---|---|
| 變量(基本類型/引用) | 值/引用不可變 | 常量、依賴注入、線程安全共享 |
| 方法 | 禁止覆蓋 | 模板方法模式、安全敏感邏輯 |
| 類 | 禁止繼承 | 不可變類(String)、工具類、安全類 |
public static final String APP_NAME = "MyApp"; // 命名慣例:全大寫+下劃線
private static final int MAX_SIZE = 100;
public class Demo {
private final String instanceConst; // 空白 final
private final int[] numbers = {1, 2, 3}; // 引用不可變,但數組內容可變
public Demo(String val) {
this.instanceConst = val; // 構造器賦值
}
public void test() {
final String localConst = "local"; // 局部 final
numbers[0] = 99; // 合法:修改對象內部狀態
// numbers = new int[3]; // 編譯錯誤:引用不可變
}
}
聲明時不賦值,**每個構造器**都必須賦值一次,確保對象構建完成前不可變。
class Base {
private void internal() {} // 隱式 final
// 子類定義同名方法不是覆蓋,而是新方法
}
建議配合 @Override 註解編譯期檢測誤覆蓋。
String、Integer、包裝類)。final class Immutable {
int mutableField = 1; // 仍可修改
}
// class Sub extends Immutable {} // 編譯錯誤
static final 定義配置常量。Collections.unmodifiableList 實現深度不可變。