4

私が基本的に欲しいのはこれです:

public class Test 
{    
   private static final Integer a;

   public Test(Integer a) 
   {
      this.a = a;
   }

}

これは明らかに機能しません。2番目に作成されたインスタンスが最後の変数をオーバーライドしようとするためです。では、コンストラクターを介してすべてのインスタンスに同じ不変の値を与える方法はありますか?

4

2 に答える 2

12

静的な最終値は、インスタンスではなく、静的なコンテキストで初期化する必要があります。

1 つのオプションは、宣言で値を設定することです。

private static final Integer a=FileConfig.getInstance().getA();

各クラスには、コードが呼び出されてクラスの静的部分を初期化する静的 {} ブロックを含めることができます。

static {
    a = FileConfig.getInstance().getA();
}

最後に、静的メソッドから値を設定できます

private static int getA() {
    return FileConfig.getInstance().getA();
}

private static final Integer a=getA();

クロージャーでは、静的インスタンスの初期化はインスタンス コンストラクターに属しません。

構成値が時々変更される場合、値 a を static final 変数に格納する理由はまったくありません。コンストラクターで定数 a を使用して各インスタンスを作成する場合、そもそも静的フィールドの目的は何ですか? どういうわけか、初めてコンストラクターを呼び出すとき、どこかから値を渡しています。値が静的かつ最終的であるに値する場合は、静的初期化子内から取得できます。構成がシングルトンではないが、すべてのインスタンスが常に a の同じ値を生成する場合、簡単に実行できますa = new FileConfig().getA();

それ以外の場合は、値を非最終的なものにすることができ、常に同じ値を入れるのでa、静的変数は変更されないので安心してください。

aそれでも、コンストラクターで設定された、クラスの最終的なインスタンス変数を作成できます。

于 2012-10-23T23:16:15.953 に答える
2

では、コンストラクターを介してすべてのインスタンスに同じ不変値を与える方法はありますか?

aタイプのオブジェクトが最初に作成されたときに値を割り当てたいと思いますTestが、後続のインスタンスが作成されたときではありません。その場合は宣言できませんfinala最初はnullになるため、コンストラクターはそれがnullかどうかを確認し、その場合は値を割り当てる必要があります。

しかし、特に呼び出し元が値を提供しなければならない理由について、設計を検討することを強くお勧めします。次の場合、2 つ目のオブジェクトが作成された後、TestTest.a が変更されないのは直感に反しませんか?

// assume this is the first `Test` object created:
Test t = new Test(5); // Test.a is 5
Test t = new Test(6); // Test.a is *still* 5
于 2012-10-23T23:17:21.197 に答える