[英]Does java(compiler or jvm) handles static final members of class differently? If yes how
圍繞靜態最終常量進行一些優化似乎是合乎邏輯的(例如,用文字等替換變量)以提高性能
對於可以內聯常數(字符串,數字) 編譯器的行為不同,是的。
當編譯器發現一個常量表達式時,它會將該常量表達式的結果嵌入到使用它的代碼中,而不是每次都計算它。 所以如果你有:
public static final int FOO = 10;
public static final int BAR = 5;
...
System.out.println(FOO * BAR);
那么常數值50將直接嵌入代碼中。
請注意,這有與之關聯的版本警告 - 如果您更改FOO
或BAR
,則需要重新編譯引用它的所有內容...否則它們仍將使用“舊”值,因為它將嵌入他們的字節碼。
是的, javac
已經這樣做了(假設您的static final
字段是基本類型或String
):常量值直接在使用點“粘貼”。
當然,這樣做的缺點是,如果你改變字段並忘記重新編譯使用該字段的類,那么該值將是陳舊的....
是的,靜態最終基元在編譯的字節碼中被替換為內聯。 這可能是問題的根源,因為如果該常量更改,則必須重新編譯所有需要它的源文件(而不僅僅是它聲明的源文件)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.