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] と見なすだけで十分ですか?

4

2 に答える 2

4

と書くfinal Object reference = someObject;と、 reference は への定数参照someObjectです。常にそのオブジェクトを「ポイント」します。

someObjectただし、それ自体が一定というわけではありません。

たとえば、 ではfinal List list = new ArrayList();、 list は常に同じリストを参照する定数ですが、そのリストに追加/削除できます。

あなたの例では、両方ともInteger不変BigIntegerであるため、参照と参照されるオブジェクトの両方が定数です。

ただし、JLS には、プリミティブと文字列のみを含む定数式を構成するものの正確な定義があることに注意してください。

于 2013-05-30T13:56:03.197 に答える
2

明らかなセマンティクスだけでなく、言語仕様からの定数の実際の定義が必要だと思います。

4.12.4ドル。final 変数は次のように述べています。

final でコンパイル時の定数式 (§15.28) で初期化されるプリミティブ型または String 型の変数は、定数変数と呼ばれます。

ソース

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); 
于 2013-05-30T13:59:29.363 に答える