2012-01-26 102 views
6

可能重複:
Guice with parents使用Guice,我該如何注入超類的構造函數參數?

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

我要注入書名到子類,例如,childrensBook應分配的標題是 「愛麗絲夢遊仙境」 和ScienceBook應得到「關於物種的起源」。 Guice怎麼能做到這一點?

(請注意,我不希望覆蓋title領域的子類)

+2

是它的類是真正如何定義的?你能修改這三個類的源代碼嗎?你有權訪問子類中顏色字段的setter? –

回答

0

您最好的選擇可能會被寫入使用不同的參數標註在子類構造 - 像

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

請解釋downvote嗎? –

5

以前問及answered here

在吉斯最佳實踐的Minimize Mutability部分埋地,你會發現這個方針:

子類必須調用super()與所有依賴關係。這使得 構造函數注入很麻煩,特別是當注入的基類 類發生變化時。

在實踐中,這裏是如何使用構造器注入做到這一點:

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,對不起。您鏈接的頁面沒有說明您聲稱的內容;你已經以一種能夠顯着改變其含義的方式從一種語境中抽出一段引文。因此,您正在推薦一種被該來源特別稱爲劣質的方法。 – ruakh

相關問題