Java GWT注射:需要良好的实践

Java GWT注射:需要良好的实践,java,gwt,gwt-gin,Java,Gwt,Gwt Gin,我经常需要一个客户端包和一些演示者和视图中的i18n-ed消息 我想知道哪一种是获得它们的最佳方式:注射还是单体 解决方案1:到目前为止,我使用单例获取消息: public interface MyMessages extends Messages{ String key1(); String key2(); ... class Instance { private static MyMessages instance = null; public stat

我经常需要一个客户端包和一些演示者和视图中的i18n-ed消息

我想知道哪一种是获得它们的最佳方式:注射还是单体

解决方案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;    
}
第二种解决方案对我来说似乎更干净,但当我需要使用一些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();
}

首先,客户机捆绑包和I18N消息,而不是单例本身,与它们的所有实例共享它们的状态,因此一旦编译成JavaScript并由编译器优化,它们就好像是单例一样。有一些极端情况(IIRC,当使用I18N接口的
with lookup
变体时),但一般来说,它并不能为您带来任何明确地将它们视为单例的东西

因此,问题基本上变成了是显式使用
GWT.create()
还是注入实例。我想说这是一个品味的问题,但从技术上讲,
GWT.create()
对非
gwtsetcase
单元测试也不起作用


最后,关于你最近的问题,我想“非空构造函数”的意思是它接受的值不是依赖项(即值对象);在这种情况下,您可能应该使用辅助注入,而不是自己构造对象,然后注入其成员(顺便说一句:您是如何注入成员的?

首先,客户端捆绑包和I18N消息,而不是单例本身,与所有实例共享其状态,因此,一旦编译成JavaScript并由编译器进行优化,就好像它们是单例一样。有一些极端情况(IIRC,当使用I18N接口的
with lookup
变体时),但一般来说,它并不能为您带来任何明确地将它们视为单例的东西

因此,问题基本上变成了是显式使用
GWT.create()
还是注入实例。我想说这是一个品味的问题,但从技术上讲,
GWT.create()
对非
gwtsetcase
单元测试也不起作用


最后,关于你最近的问题,我想“非空构造函数”的意思是它接受的值不是依赖项(即值对象);在这种情况下,您可能应该使用辅助注入,而不是自己构造对象,然后注入其成员(顺便提一下:您是如何注入成员的?

“非空构造函数”=>“非空构造函数”,抱歉:),那么将
MyMessages
作为构造函数参数注入有什么问题?(正如你在上面的
FooView
中所做的那样)我实际上不知道什么是辅助注射,所以我读了谷歌文档。感谢您的支持,它在某些用例中非常有用。也就是说,对每个需要i18n或bundle的类使用辅助注入似乎很难。因此,对于这个用例,我将继续使用GWT.create():)“non-null构造函数”=>“non-empty构造函数”,抱歉:)那么将
MyMessages
作为构造函数参数注入有什么问题呢?(正如你在上面的
FooView
中所做的那样)我实际上不知道什么是辅助注射,所以我读了谷歌文档。感谢您的支持,它在某些用例中非常有用。也就是说,对每个需要i18n或bundle的类使用辅助注入似乎很难。因此,对于这个用例,我将继续使用GWT.create():)