2012-05-19 2 views
2

У меня есть простая иерархия, как следует:Guice - как придать абстрактное поле родителя от ребенка

public abstract class AbsFoo { 
    protected AbsBoo boo; 
} 

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

EDIT: Экземпляры AbsFoo должны быть созданы на лета и не могут быть полями

Может Я заменяю boo = new Boo() инъекцией?

ответ

3

Да:

public abstract class AbsFoo { 
    protected AbsBoo boo; 
} 

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

Убедитесь, что вы построить свой экземпляр Foo с @Inject или injector.getInstance()

Edit

Вы можете также использовать поставщик для создания экземпляров на спрос:

@Inject 
Provider<Foo> fooProvider 

//... 

public void doSomething(){ 
    //need new foo: 
    Foo foo = fooProvider.get(); 
} 
+0

Ну, проблема в том, что AbsBoo и его дети должны быть подвержены внешнему миру. Я хочу избежать этого. Foo знает, что ему нужно Boo, и никто больше не должен знать – Bostone

+0

Как это выведет AbsBoo во внешний мир? –

+0

Я думаю, что здесь отсутствует важная информация. Foo необходимо создать динамически. Я использовал «AbsFoo foo = new Foo()», поэтому я не хочу делать «AbsFoo foo = new Foo (new Boo()), если могу помочь ему – Bostone

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); 
    ... 
} 
+0

Будет ли это работать, если мне нужно создать несколько экземпляров различных реализаций AbsFoo Дополнения? – Bostone

+0

@Bostone - не совсем. вам, вероятно, лучше воспользоваться фабрикой в ​​этот момент и ввести соответствующие зависимости, необходимые для каждой реализации. – tvanfosson

Смежные вопросы