2012-01-26 14 views
6

Eventuali duplicati:
Guice with parentsUsando Guice, come faccio ad iniettare i parametri del costruttore della super classe?

class Book{string title;} 
class ChildrensBook extends Book{} 
class ScienceBook extends Book{} 

voglio iniettare titoli di libri nelle sottoclassi, per esempio, childrensBook dovrebbe essere assegnato il titolo di "Alice nel paese delle meraviglie" e ScienceBook dovrebbe ottenere "sull'origine delle specie". Come posso realizzare questo con Guice?

(Si noti che non voglio sovrascrivere il campo title nella sottoclasse)

+2

E 'davvero come le classi sono definite? Puoi modificare il codice sorgente di queste tre classi o no? Hai accesso a un setter per il campo colore nelle sottoclassi? –

risposta

0

La cosa migliore sarebbe probabilmente scriverà costruttori sottoclasse con diverse annotazioni dei parametri - qualcosa come

class ChildrensBook extends Book { 
    @Inject ChildrensBook (@AliceInWonderland String title) { 
    super(title); 
    } 
} 
+1

Spiega il downvote, per favore? –

5

precedenza chiese e answered here:

Sepolto nella sezione Minimize Mutability dei Guice Best Practices, troverete questa linea guida:

Le sottoclassi devono chiamare super() con tutte le dipendenze. Questo rende ingombrante l'iniezione del costruttore , in particolare con le modifiche apportate alla classe iniettata .

In pratica, ecco come farlo con iniezione costruttore:

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

-1, mi spiace. La pagina a cui ti colleghi non dice quello che tu rivendichi; hai tirato una citazione fuori dal contesto in un modo che cambia radicalmente il suo significato. Di conseguenza, stai raccomandando un approccio che è specificamente chiamato come inferiore da quella fonte. – ruakh

Problemi correlati