首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java static 與 final 變量陷阱:非法前向引用與靜態塊不執行

     編輯:Java 相關知識

陷阱一:illegal forward reference

public final class Constants {
    public static int VAR2 = VAR1 + 1; // 編譯錯誤
    public static int VAR1 = 1;
}

原因:類初始化時靜態變量按文本順序賦值。VAR2 初始化時 VAR1 尚未賦值(雖已聲明),違反「聲明先於使用」原則。
修正:調整順序或將常量值提取為字面量。

陷阱二:final 變量導致 static 塊不執行

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 或私有構造子的工具類模式替代。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved