2012-02-26 20 views
4

在下面的代碼中,需要用「Inject」註釋我的基類的構造函數嗎?如果基類是一個抽象類呢?Java和Guice - 如何處理繼承和抽象?

使用DI時,是否需要在構造函數中調用super?

public class Base { 

    @Inject 
    public Base(IConfig config) { 
     // Do stuff 
    } 
} 

public class A extends Base { 

    @Inject 
    public A(IConfig config) { 
     super(config); 
    } 
} 
+0

爲什麼你想擴展一個具體的注射類?我親眼看到大多數情況下,人們試圖通過其他方式來解決問題。例如,如果要改變構造函數params的提供方式,那麼類似'@Proced'方法的工作往往會更好。如果要覆蓋具體的方法,那就表明基類沒有解決實際的用例,並且需要重新設計。 Guice最佳實踐wiki對'@Inject public'構造函數發出警告(請參閱http://code.google.com/p/google-guice/wiki/KeepConstructorsHidden) – 2012-06-04 20:00:27

回答

4

取決於你想要綁定什麼。如果你將Base綁定到Abind(Base.class).to(A.class)),那麼是的,第二個構造函數和@Inject是必需的,但Base上的不是。如果您打算構建Base,則需要@Inject

關於調用super(),Java需要它(這與Guice無關),如果你只有一個構造函數與IConfig。但是,如果您不需要在Base中注入IConfig,則無法阻止您將其刪除。