0

さて、私は最終的なプロパティを持っていますが、オブジェクトを作成するときにそれを初期化したくありません。そのため、コンストラクターで初期化しないようにしましたが、セッターを使用して、一度だけ使用できるセッターのようなものだったと思いましたが、次のエラーが発生しました:

Test.java:27: エラー: 最終変数 foo に値を代入できません

    this.foo = new String(foo);

これをテストするために使用した短いコードを次に示します。

class Test {

    private final String foo;

    public static void main(String[] args) {
        Test test = new Test();
        test.setFoo("gygygy");
        System.out.println(test.getFoo());
    }

    public Test() {
        System.out.println("Constructor");
    }

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

}

したがって、コンストラクターは暗黙的に this.foo = new String(); のようなものを作成すると仮定します。または this.foo = null; この動作を変更することはできないと思いますが、やりたいことと同等のものをどのように手に入れることができますか? 私は次のように考えます:

private String foo;

/* ... */

public void setFoo(String foo) {
    if( !(this.foo.isInitialized()) )
        this.foo = foo;
}

しかし、 Object.isInitialized() メソッドは明らかに存在せず、同等のものが見つかりません x)

だからここに私の質問があります:どうすればいいですか?オブジェクトのインスタンス化時に初期化されない最終属性が必要です。

ありがとう !

4

3 に答える 3

2

ブール値フィールドを追加できますisInisializedが、最良のオプションはコンストラクターで値を渡すことです (必要に応じて Builder パターンを使用する可能性があります)。

于 2012-07-22T16:37:25.777 に答える
1

だからここに私の質問があります:どうすればいいですか?オブジェクトのインスタンス化時に初期化されない最終属性が必要です。

あなたは単にそれを行うことはできません. できることは、「実際の」フィールドを設定したら、別のフィールドを更新してメモすることだけです。もう一度設定しようとすると、例外がスローされます。

または、型を不変にしますが、単一の新しい値を除いて以前と同じデータを使用して、クラスの新しいインスタンスを構築するメソッドを与えます。

public Test withFoo(String newFoo) {
    // Call a private constructor here, passing in the other fields from
    // "this", and newFoo for the value of foo
}
于 2012-07-22T16:37:36.153 に答える
0

規則では、最終的なインスタンス メンバー変数は、宣言されている場所またはコンストラクター内で初期化する必要があります。この規則により、コードをそのままでは要件を満たすことはできません。ビルダーパターンを使用してそれを実現できます。このリンクを参照してください効果的なJavaのビルダーパターン

于 2012-07-22T16:39:32.843 に答える