2016-09-27 66 views
0

我發現當在一個項目中聲明一個常量(static final,在編譯時進行初始化)時,在編譯時其他項目中的引用被替換爲文字。編譯時避免用一個文字替換常量引用

看來,以避免這一點,必須引用的唯一途徑是指恆領域,而不是字面是聲明不變的一類(而不是接口),並省略「最終的」,例如:

public class MyClass { 
    public static String MY_CONSTANT = "The constant value"; 
} 

不幸的是我編寫了一個充滿常量的界面,然後才明白這一點,現在爲了改變一個常量,我們必須確定引用它並重新編譯它們的所有項目。我擔心有什麼東西會溜走。

另外,沒有「最終」修飾符的常量並不完全一致,是嗎?

是否有一個編譯選項,可以通過文字抑制常量引用的替換?

+0

您在Java知識中發現了一個漏洞。並記錄:是的,這在某種程度上是大型設置的問題,但**這是一個衆所周知的問題。任何合理的**構建系統**應該能夠處理該問題;通過**理解**依賴和需要重新編譯需要的所有類...... – GhostCat

+0

不久前我們也犯過同樣的錯誤。 我們比改接口有getter-Methods。 和一個實現類。 請看看Joshua Bloch的「Effective Java」。項目19: 「僅使用接口來定義類型」 –

回答

1

你只需要一些不是compile-time constant expression。例如,方法調用不是。所以只要在每個文字末尾加上.intern()就可以避開規則。然後,每個引用網站必須確保目標類型已初始化並讀取當前值。

更改此行爲的編譯器選項是不可能的,因爲它違反了Java語言規範。