2013-04-11 74 views
0

我經常需要一個客戶端軟件包和一些國際化的演示文稿和視圖中的消息。GWT注射:需要良好的練習

我想知道哪些是最好的方法讓他們:注射或Singleton?

解決方案1:到現在爲止,我用使用的消息辛格爾頓得到:

public interface MyMessages extends Messages{ 

    String key1(); 
    String key2(); 
    ... 

    class Instance { 
    private static MyMessages instance = null; 

    public static MyMessages getInstance() { 
     if (instance == null) { 
     instance = GWT.create(MyMessages.class); 
     } 
     return instance; 
    } 
    } 
} 

FooView.java:

MyMessages.Instance.getInstance().key1(); 

解決方案2:它會更好用這樣的注射來得到它?

private MyMessages i18n;  

@Inject 
public FooView(MyMessages i18n){ 
    this.i18n=i18n;  
} 

第二個解決方案似乎更清潔給我,但我有時會卡住,當我需要它使用了一些國際化的字符串非空的構造:

@Inject 
private MyMessages i18n; 

public Bar(Foo foo){ 
    /* 
    * do something which absolutely requires i18n here. 
    * The problem is that injectable attributes are called 
    * after the constructor so i18n is null here. 
    */ 
    foobar(); 
} 

回答

3

首先,客戶端軟件包和國際化的消息,而不是單身人士自己,與他們的所有實例分享他們的狀態,以便一旦編譯爲JavaScript並由編譯器優化,就好像他們是單身人士。有幾個角落案例(IIRC,當使用I18N接口的WithLookup變體時),但一般來說,它不會明確地將它們視爲單身人士。

所以這個問題基本上成爲明確使用GWT.create()還是注入實例。我會說這是一個味道的問題,但是從技術上來說GWT.create()對單元測試的效果並不好。最後,至於你的最新問題,我想通過「非空構造函數」,你的意思是它取值不是依賴關係(即值對象)。在這種情況下,您可能應該使用輔助注射而不是自己構建對象,然後注入其成員(作爲旁白:您如何注入成員?)

+0

「非空構造函數」=>「非空構造函數「,對不起:) – user2147970 2013-04-11 13:05:42

+0

然後注入'MyMessages'作爲構造函數參數有什麼問題? (就像你在上面的'FooView'中做的那樣) – 2013-04-11 13:18:25

+0

我其實並不知道鄰接輔助注入,因此我閱讀了關於它的google文檔。謝謝你,這在一些使用情況下非常有用。也就是說,對於需要國際化或捆綁的每個班級使用輔助注射似乎很重要。因此,對於這個用例,我將繼續使用GWT.create():) – user2147970 2013-04-15 06:54:08