簡體   English   中英

java(編譯器或jvm)是否以不同方式處理類的靜態最終成員? 如果是的話

[英]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將直接嵌入代碼中。

請注意,這有與之關聯的版本警告 - 如果您更改FOOBAR ,則需要重新編譯引用它的所有內容...否則它們仍將使用“舊”值,因為它將嵌入他們的字節碼。

是的, javac已經這樣做了(假設您的static final字段是基本類型或String ):常量值直接在使用點“粘貼”。

當然,這樣做的缺點是,如果你改變字段並忘記重新編譯使用該字段的類,那么該值將是陳舊的....

是的,靜態最終基元在編譯的字節碼中被替換為內聯。 這可能是問題的根源,因為如果該常量更改,則必須重新編譯所有需要它的源文件(而不僅僅是它聲明的源文件)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM