不必顯式賦值。 Java 類載入時會自動將靜態變數初始化為型別預設值:
| 型別 | 預設值 |
|---|---|
| 基本型別 | int/short/byte/long → 0, float/double → 0.0, boolean → false, char → '\u0000' |
| 參考型別 | null (String、自訂類別、陣列等) |
public static List names; // null
names.add("A"); // NPE! private static final int MAX_RETRY = 3; 比散落的魔術數字清楚。public class Config {
// 1. 常數:final + 大寫 + 顯式值
public static final int DEFAULT_TIMEOUT = 3000;
public static final String API_VERSION = "v2";
// 2. 可變靜態狀態:私有 + 顯式初始化 + 同步存取器
private static volatile boolean initialized = false;
private static Map cache = new ConcurrentHashMap<>();
public static boolean isInitialized() { return initialized; }
public static void setInitialized(boolean v) { initialized = v; }
public static Map getCache() { return cache; }
}
若初始化邏輯複雜(讀檔、連線、計算),使用靜態區塊:
static {
try {
// 載入配置檔、建立連線池...
initialized = true;
} catch (Exception e) {
throw new ExceptionInInitializerError(e); // 讓類載入失敗,快速暴露問題
}
}
Java 保證靜態變數有預設值,**但預設值往往不是業務期望值**。請養成「顯式初始化、final 常數化、私有封裝、同步存取」的習慣,將 NPE 與邏輯 Bug 消滅在編碼階段。