2013-05-30 59 views
2
public class Constants { 

    // This is a constant for sure! 
    public static final int NUMBER1 = 42; 

    // This is a constant. 
    public static final Integer NUMBER2 = 42; 

    // Is this really a constant? 
    public static final BigInteger NUMBER3 = new BigInteger("42"); 

} 

必須恆定一定是原始[NUMBER1](或基本類型的包裝[NUMBER2]),或不static final足以考慮一個字段作爲常數NUMBER3]?什麼確定了一個常量?

+0

我想說一個常數是一個在程序執行過程中不能修改的值或者一個句子的「生命」。但它可以是任何東西,只要它不可變。 – Djon

回答

4

當您編寫final Object reference = someObject;時,引用是對someObject的常量引用。它將始終「指向」該對象。

但是,這並不意味着someObject本身是恆定的。

例如,在final List list = new ArrayList();中,list是一個常量,它將始終引用相同的列表,但可以將該列表添加到該列表中。

在您的示例中,IntegerBigInteger都是不可變的,因此引用和引用的對象都是常量。

但請注意,JLS有a precise definition of what constitutes a constant expression,它只包含基元和字符串。

2

我假設你想要的實際定義從語言規範,而不僅僅是明顯的語義。

$ 4.12.4。最後變量表示如下:

原始類型或String類型的變量,也就是最後的並用一個編譯時間常量表達式(§15.28)初始化 ,是 稱爲常量變量

Source

的JLS定義這樣的常量的原因是因爲它給了一些額外的優化潛力(以及它似乎是在那個時候是個好主意):

class Foo { 
    public static final int BAR = 5; 
} 

// other compilation unit 
System.out.println(Foo.BAR); 
// compiler is allowed to generate the following code instead: 
System.out.println(5); 
相關問題