2012-01-26 9 views
6

Duplicar posible:
Guice with parentsUsando Guice, ¿cómo puedo inyectar los parámetros del constructor de la superclase?

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

Quiero inyectar títulos de libros en las subclases, por ejemplo, childrensBook debe asignar el título de "Alicia en el país de las maravillas" y ScienceBook debe obtener "Sobre el origen de las especies". ¿Cómo puedo lograr esto con Guice?

(Tenga en cuenta que no quiero para sobrescribir el campo title en la subclase)

+2

¿Es realmente cómo se definen las clases? ¿Puedes modificar el código fuente de estas tres clases o no? ¿Tiene acceso a un colocador para el campo de color en las subclases? –

Respuesta

0

Su mejor opción probablemente estaría escribiendo los constructores de subclases con diferentes anotaciones de parámetros - algo así como

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

Explique el voto a favor, por favor? –

5

Anteriormente preguntó y answered here:

enterrado en la sección Minimize Mutability de las mejores prácticas Guice, se encuentra esta directriz:

Las subclases deben llamar al super() con todas las dependencias. Esto hace que el constructor sea engorroso, especialmente porque la clase de base inyectada cambia.

En la práctica, aquí está cómo hacerlo mediante la inyección de constructor:

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, lo siento. La página a la que se vincula no dice lo que usted afirma que hace; sacó una cita fuera de contexto de una manera que cambia drásticamente su significado. Como resultado, está recomendando un enfoque que específicamente se menciona como inferior por esa fuente. – ruakh

Cuestiones relacionadas