2012-06-19 9 views
6

でスーパー呼び出し前にオブジェクトを作成します。私は母のクラスでそれをプッシュする必要があるので、私はsuper()呼び出し前にオブジェクトを作成する必要があり単純なJavaコード動作しないであろうことを考えるとjavaの

public class Bar extends AbstractBar{ 

    private final Foo foo = new Foo(bar); 

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

私は初期化ブロックを使用したくないと私は何かしたくない

:私は前に母クラスにデータを送信することができますどのように私のコンストラクタで

super(new Foo(bar))を...

スーパーコール?

+1

何をしようとしていますか?より大きな問題は何ですか? – ametren

+7

コンストラクタに 'super(new Foo(bar))'を入れてみませんか? 'Foo'コンストラクタの' bar'は何ですか? – tibtof

+0

コンストラクターで渡すフィールドがたくさんあるので、そのようにしたくありません。 –

答えて

15

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が得られます。

1

これはjavaではできません。唯一可能な解決策は、スーパーコンストラクターでの新しい呼び出しです。

fooというオブジェクトは、スーパークラスがあなたのコントロール下にある場合、あなたはそれをリファクタリングとにオブジェクトを引っ張るために、テンプレートメソッドパターンを使用することができ、静的

public class Bar extends AbstractBar{ 

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

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

としてそれをDECLARもインスタンス間で共有することができた場合それをサブクラスから削除するのではなく、コンストラクタを使用します。これはhollywod原則をapplys:私たちを呼び出すことはありません、私たちはあなたを呼びます。)

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(); 
    } 
} 
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{...} 
関連する問題