4

次のような単純な階層があります。

public abstract class AbsFoo {
    protected AbsBoo boo;
}

public class Foo extends AbsFoo {
    public Foo() {
        boo = new Boo(); // Boo extends AbsBoo
    }
} 

編集: AbsFoo のインスタンスはその場で作成する必要があり、フィールドではない場合があります

boo = new Boo()注射で代用できますか?

4

2 に答える 2

6

はい:

public abstract class AbsFoo {
    protected AbsBoo boo;
}

public class Foo extends AbsFoo {
    @Inject
    public Foo(Boo boo) {
        super.boo = boo; // Boo extends AbsBoo
    }
} 

@Inject または inspector.getInstance() を使用して Foo インスタンスを作成してください。

編集

プロバイダーを使用して、オンデマンドでインスタンスを作成することもできます。

@Inject
Provider<Foo> fooProvider

//...

public void doSomething(){
    //need new foo:
    Foo foo = fooProvider.get();
}
于 2012-05-19T18:16:00.617 に答える
2

Boo自体が抽象的でない限り、抽象化できるはずです。

public class Foo extends AbsFoo {

    @Inject
    public Foo( AbsBoo boo ) {
        this.boo = boo;
    }
}

public class FooModule extends AbstractModule {
  @Override 
  protected void configure() {
    bind(AbsBoo.class).to(Boo.class);
    bind(AbsFoo.class).to(Foo.class);
  }
}

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new FooModule());
    AbsFoo foo = injector.getInstance(AbsFoo.class);
    ...
}
于 2012-05-19T18:23:02.787 に答える