0

プレゼンターとビューにクライアント バンドルと i18n 化されたメッセージが必要になることがよくあります。

それらを取得するための最良の方法はどれですか:インジェクションまたはシングルトン?

解決策 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;    
}

2番目の解決策は私にはきれいに思えますが、いくつかの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();
}
4

1 に答える 1

3

まず、クライアント バンドルと I18N メッセージは、シングルトン自体ではありませんが、その状態をすべてのインスタンスと共有するため、JavaScript にコンパイルされ、コンパイラによって最適化されると、シングルトンであるかのようになります。いくつかのコーナーケース (IIRC、WithLookupI18N インターフェースのバリアントを使用する場合) がありますが、一般的に言えば、それらをシングルトンとして明示的に扱うことには何のメリットもありません。

したがって、問題は基本的に、GWT.create()明示的に使用するか、インスタンスを注入するかになります。それは好みの問題だと思いますが、技術的にも非単体テストGWT.create()ではうまくいきません。GWTTestCase

最後に、最新の質問については、「null 以外のコンストラクター」とは、依存関係ではない値 (値オブジェクト) を取ることを意味していると思います。その場合、オブジェクトを自分で構築してからそのメンバーを注入するのではなく、おそらく補助注入を使用する必要があります (余談ですが、メンバーをどのように注入していますか?)

于 2013-04-11T12:54:18.930 に答える