Enterré dans la section Minimize Mutability des Guice meilleures pratiques, vous trouverez cette ligne directrice:
Les sous-classes doivent appeler super()
avec toutes les dépendances. Cela rend l'injection du constructeur lourde, d'autant plus que la base injectée change de classe.
Dans la pratique, voici comment le faire en utilisant l'injection de constructeur:
public class TestInheritanceBinding {
static class Book {
final String title;
@Inject Book(@Named("GeneralTitle") String title) {
this.title = title;
}
}
static class ChildrensBook extends Book {
@Inject ChildrensBook(@Named("ChildrensTitle") String title) {
super(title);
}
}
static class ScienceBook extends Book {
@Inject ScienceBook(@Named("ScienceTitle") String title) {
super(title);
}
}
@Test
public void bindingWorked() {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override protected void configure() {
bind(String.class).
annotatedWith(Names.named("GeneralTitle")).
toInstance("To Kill a Mockingbird");
bind(String.class).
annotatedWith(Names.named("ChildrensTitle")).
toInstance("Alice in Wonderland");
bind(String.class).
annotatedWith(Names.named("ScienceTitle")).
toInstance("On the Origin of Species");
}
});
Book generalBook = injector.getInstance(Book.class);
assertEquals("To Kill a Mockingbird", generalBook.title);
ChildrensBook childrensBook = injector.getInstance(ChildrensBook.class);
assertEquals("Alice in Wonderland", childrensBook.title);
ScienceBook scienceBook = injector.getInstance(ScienceBook.class);
assertEquals("On the Origin of Species", scienceBook.title);
}
}
Que faire si plus tard dans le code j'ai besoin de construire ChildClass? Quelle est la meilleure façon de faire cela? Comme ChildClass child = new ChildClass (nouveau Foo(), barre)? Et si Foo a aussi des injections? – lapkritinis