6

動作しない単純な Java コードを考慮すると、次のようになります。

public class Bar extends AbstractBar{

    private final Foo foo = new Foo(bar);

    public Bar(){
        super(foo);
    }
}

super()マザークラスにプッシュする必要があるため、呼び出しの前にオブジェクトを作成する必要があります。

初期化ブロックを使用したくないし、次のようなこともしたくありません。

super(new Foo(bar))私のコンストラクタで..

スーパーコールの前にマザークラスにデータを送信するにはどうすればよいですか?

4

3 に答える 3

17

フィールドに格納する必要がある場合Fooは、次のようにします。

public class Bar extends AbstractBar{    
    private final Foo foo;

    private Bar(Foo foo) {
        super(foo);
        this.foo = foo;
    }

    public Bar(){
        this(new Foo(bar));
    }
}

それ以外の場合super(new Foo(bar))は、私にとってはかなり合法に見えます。必要に応じnew Foo(bar)staticメソッドにラップできます。

また、スーパークラス コンストラクターの後に実行されるため、フィールド初期化子 (例のように) と初期化ブロックも役に立たないことに注意してください。フィールドが例として宣言されfinalている場合はコンパイルされません。それ以外の場合はnull、スーパークラス コンストラクターになります。

于 2012-06-19T15:38:16.390 に答える
1
class AbstractBar{
    public AbstractBar() {
    }
    public AbstractBar(Foo t) {
    }
}
class Bar extends AbstractBar{
    static Foo t=null;
    public Bar() {
        super(t=new Foo());
    }
}
class Foo{...}
于 2012-06-19T15:44:15.450 に答える
1

それはJavaでは不可能です。唯一可能な解決策は、スーパー コンストラクターでの新しい呼び出しです。

インスタンス間で foo オブジェクトを共有できる場合は、それを static として宣言できます。

public class Bar extends AbstractBar{

    private static final Foo foo = new Foo(bar);

    public Bar(){
        super(foo);
    }
}

スーパー クラスが制御下にある場合は、それをリファクタリングし、テンプレート メソッド パターンを使用して、オブジェクトをサブクラスからプッシュする代わりにコンストラクターにプルすることができます。これはハリウッドの原則に当てはまります。電話しないでください。電話します ;)

public abstract class AbstractBar{

    private Object thing;

    public AbstractBar(){
         this.thing = this.createThatThing();            
    }

    protected abstract Object createThatThing();
}

public class Bar extends AbstractBar {

     // no constructor needed

     protected Object createThatThing(){
          return new Thing();
     }
}
于 2012-06-19T15:37:43.493 に答える