2009-12-03 62 views
2

總Guice noob在這裏,閱讀了一些文章,看過介紹視頻,就是這樣。如何在有兩種不同的構造函數時使用Guice注入?

這裏是我試圖「guicifiy」的簡化舊代碼。不能完全弄清楚如何,因爲(據我所知),我只能@inject -annotate兩個構造函數之一?一個調用類如何創建一個或另一個實例?或者我會不得不重構這個?

public class MyDialog extends JDialog { 
    public MyDialog(JFrame parent, <other parameters...>) { 
     super(parent); 
    } 

    public MyDialog(JDialog parent, <other parameters...>) { 
     super(parent); 
    } 
} 

回答

4

您只能注入一個ctor。

取決於如何類被使用,你可以:

  • 注入進廠的客戶端代碼有兩個「新」的方法。
  • 將所有參數放入一個ctor,並在不需要時傳遞null。

調用類如何創建一個或另一個實例?

這表明調用類需要多個MyDialog實例?然後你需要使用一個手動軋製的工廠(如果你只有一個Ctor,Assisted Inject可以爲你處理)。我不知道你在做什麼的細節,我可能會重複你已經知道的內容,但作爲一個空話,我建議從MyDialog中提取一個接口並讓工廠返回它們。這樣你可以在測試中僞造MyDialog。

1

構造注射非常乾淨。 mlk是對的,說你可以只注入一個構造函數。

你可以做的是使用方法注入:

public class Smt { 

    private int a; 
    private Cereal cereal; 
    private Personality personality; 
    private ignition; 

    public Smt() { 
     this.a = 5; 
    } 

    public Smt(int a) { 
     this.a = a; 
    } 

    @Inject 
    public void setup(@CiniMini Cereal cereal, @Rastafarian Personality personality, 
     Ignition ignition) { 
     this.cereal = cereal; 
     this.personality = personality; 
     this.ignition = ignition; 
    } 
} 

什麼吉斯需要做的是調用你的類setup類的方法,並提供所有的注射。然後你在構造函數中做同樣的事情 - 將對象分配給你的類的屬性。

0

我同意以前的評論。 只是一個額外的提示:構造函數注入應該提供一個類所需的所有依賴關係。正如mlk所說,一種方法可能是用大多數參數註釋構造函數,然後通過在需要的地方傳遞空值來重構另一個函數來調用前者。
此外,Guice 3.0支持所謂的構造函數綁定,允許程序員指定使用哪個構造函數。有關更多詳細信息,請參見here

相關問題