public final class Constants {
public static int VAR2 = VAR1 + 1; // 編譯錯誤
public static int VAR1 = 1;
}
原因:類初始化時靜態變量按文本順序賦值。VAR2 初始化時 VAR1 尚未賦值(雖已聲明),違反「聲明先於使用」原則。
修正:調整順序或將常量值提取為字面量。
public final class Constants {
static {
System.getProperties().load(new FileInputStream("constants.properties"));
}
public static final int VAR1 = Integer.parseInt(System.getProperty("var1"));
public static final int VAR2 = Integer.parseInt(System.getProperty("var2"));
}
現象:運行時 VAR1/VAR2 為 0,static 塊未執行。
原因:final static 基本類型/字符串屬於編譯期常量,編譯器在編譯期計算其值並內聯到調用處,**類初始化階段不再執行賦值表達式**,導致 static 塊無副作用被優化掉(或根本不觸發類初始化)。
修正:去掉 final、或改為非基本類型包裝類、或在 static 塊中賦值非 final 域。
final**,或使用 static 塊統一賦值非 final static 域。enum 或私有構造子的工具類模式替代。