3

最終的なint、valAを含むクラスAがあります。

大きな最終オブジェクトobjBを含むサブクラスBがあります。

valAの値は、Bのコンストラクターで渡されるobjBに依存します。

Bのインスタンスを作成するにはどうすればよいですか?

私がやろうとしていることのための最小限のコードを含めました。

public class Test {
    public static void main(String[] args){
        System.out.println(new B(3).valA);
    }
    static class A{
        final int valA;
        A(int valA) {
            this.valA = valA;
        }
    }
    static class B extends A{
        final Object objB;
        B(int initVal) {
            this.objB = someMethod(initVal);
            super(objB.hashCode()+1);
        }
    }
    Object someMethod(int initVal){
        // pretend there's some super complicated logic that returns a large object
        return new Object();
    }
}
4

2 に答える 2

3

スーパーコンストラクターの呼び出しは、コンストラクターの最初のステートメントである必要があります。したがって、B次のようになります。

static class B extends A{
    final int valB;
    B(int valB) {
        super(valB+1);
        this.valB = valB;
    }
}

また、スーパーコンストラクター呼び出しからインスタンスメソッドを参照することはできません。メソッドを作成initC()することはできstaticますが、内部からインスタンス変数を割り当てることができなくなるため、その目的は無効になります。initC()

更新された質問を考えると...

この初期化の問題は回避できません。これは実際には設計上の問題です。非常に大きなオブジェクトの構造を外部の「ファクトリー」に抽出し、コンストラクターを可能な限りスリムに保ちながら、初期化Aの複雑さを軽減することをお勧めします。B

于 2012-12-29T21:17:27.847 に答える
2

Bでオーバーロードされたコンストラクターを使用できます。以下のコードでは、someMethodが静的になっています。あるいは、Bの最終メンバーメソッドである可能性があります。

public class Test {
    public static void main(String[] args){
        System.out.println(new B(3).valA);
    }
    static class A{
        final int valA;
        A(int valA) {
            this.valA = valA;
        }
    }
    static class B extends A{
        final Object objB;
        B(int initVal) {
            this(someMethod(initVal));
        }
        private B(Object objB) {
            super(objB.hashCode()+1);
            this.objB = objB;
        }
    }
    static Object someMethod(int initVal){
        // pretend there's some super complicated logic that returns a large object
        return new Object();
    }
}
于 2012-12-29T22:03:52.217 に答える