2013-04-11 44 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