2013-10-01 51 views
2

這裏使用的參數是我遇到的問題的例子:吉斯:在注射執行抽象方法

public interface IFoo { ... } 

public abstract class Helper implements IFoo { 
    public Helper() { ... } 

    protected abstract X helperMethod(); 
}  

public class Foo extends Helper { 
    private final String aaa; 

    @Inject 
    public Foo(String aaa) { this.aaa = aaa; } 

    @Override 
    X helperMethod() { doSomethingUsingWhatsInjected(aaa); } 
} 

的問題是,當我綁定的IFoo爲foo這樣的:

bind(IFoo.class).to(Foo.class).in(Singleton.class); 

它看起來像helperMethod()之前調用aaa已被注入,因爲我看到aaanull。但是,如果我不使用類Helper並直接在Foo中直接插入其所有代碼,那麼guice不會很困難。

這兩種方法有什麼區別?爲什麼helperMethod()在我們知道從哪裏獲得IFoo的實現之前調用?我們可以使用Helper以及注射嗎?

回答

2

你確定你沒有從Helper的構造函數中呼叫helperMethod?您從發佈的代碼中刪除了該部分,但它與您所看到的行爲相符。

public class Test { 
    interface IFoo { } 

    static abstract class Helper implements IFoo { 
    Helper() { helperMethod(); } 
    abstract void helperMethod(); 
    } 

    static class Foo extends Helper { 
    private final String aaa; 

    Foo(String aaa) { this.aaa = aaa; } 

    @Override 
    void helperMethod() { System.out.println(String.valueOf(aaa)); } 
    } 

    public static void main(String[] args) { 
    // Call helperMethod twice: 
    // once in the Helper.Helper(), once right here. 
    new Foo("expected").helperMethod(); 
    // output: 
    // null 
    // expected 
    } 
} 

的第一件事富確實是隱式調用它的父類的構造,因爲如果你鍵入super();這必然會發生在子類構造函數中的第一個語句中。因此,甚至在最終變量如aaa被設置之前會發生這種情況,所以您在Foo中的重寫方法將aaa視爲null。在我的例子中,這不是Guice特有的,但Guice注入可以像其他任何東西一樣觸發構造函數。

This StackOverflow answer提供了一個更徹底的討論這個問題。

+0

你完全正確。我檢查了,我*從'Helper'的構造函數中調用'helperMethod()'。當我寫下我的例子時,我錯誤地忽略了這個細節。這回答我的問題,謝謝! – apolune