1

何か説明してくれませんか。ここにいくつかのシナリオがあります。

クラス テンプレートがあり、アプリで Gin/Guice を使用するとします。

@Singleton
public class Template extends Compose
{
private HorizontalPanel header;
private HorizontalPanel content;
private VerticalPanel menu;

    public Template()
    {
      this.add(initHeader());
      this.add(initMenu());
      this.add(initContent());
    }

    public void setContent(Widget widget)
    {
      content.clear();
      content.add(widget);
    }
    .............
    ......
    }

そしてエントリークラスで

........
public void onModuleLoad()
{

RootPanel.get().add(new Template());
....
}

コンテンツをリロードする必要があるたびに..

例えば

HorizontalPanel hp = new HorizontalPanel();
hp.add ....
...

Template template = injector.getTemplate(); // return singleton instance using gin
template.setContent(hp)

等々..

したがって、テンプレートはシングルトンであり、私が知る限り、シングルトン インスタンスは VM ごとに 1 つであるため、アプリケーション全体で共有されます。テンプレートクラスにはヘッダー、メニュー、コンテンツがあり、ウィジェットのクリーニングと追加としてコンテンツ部分のみをリロードするという考え方です。しかし、これは良いアプローチですか?

たとえば、ユーザー「A」が setContent(widgetA) のような状況になり、同時にユーザー「B」がメソッド setContent(widgetB) を使用すると、どうなるでしょうか?

ありがとう、誰かが最終的に良いアプローチを私と共有してコメントしてくれたら。

よろしく

4

3 に答える 3

12

@SingletonインスタンスにスコープされますGinjector(はい、2回すると、2つの「シングルトン」が得られます)。GIN が何らかの方法で inを「傍受」できるという単一の手段はないため、個別のインスタンスを返します。(これは、Stein が話す「シングルトン コードのアンチパターン」とはまったく異なります。使用状態)GWT.create()GInjectornew Template()onModuleLoadinjector.getTemplate()templatestatic

魔法はありません。GIN はコード ジェネレーターであり、手で入力できるコードのみを記述します。

他の質問について:

  • クライアント コードは、明らかにクライアント上、つまりブラウザ上で実行されます。アプリを表示するブラウザー タブ/ウィンドウごとに 1 つの「アプリケーション インスタンス」があります。「ユーザー A」と「ユーザー B」が同時に存在することはありません。
  • JavaScript はシングル スレッドであるため、同時アクセスも心配する必要はありません。
于 2011-06-17T09:25:11.770 に答える
1

アプリの一般的な RPC コードをクラスに挿入しました。方法は次のとおりです。

@Singleton
public class SomeService {

/** The real service. */
private static final RealServiceAsync realService;

...

}

私たちのジン モジュール:

public class MyGinModule extends AbstractGinModule {

    @Override
    protected void configure() {
        bind( SomeService .class ).in(Singleton.class);
        ...
        ...
    }

}

そして、次のようにシングルトンとして注入されます。

public class ApplicationInfoPresenter {

@Inject
private SomeService service;

...
...

}
于 2011-06-17T11:35:57.180 に答える
0

注釈が GWT コンパイラによって無視されることは確かです。

gwt でシングルトンが必要な場合は、プライベート/保護されたコンストラクターを持つクラスと、null の場合にインスタンスを初期化してインスタンスを返すメソッドを作成するだけprivate static NameOfSingletonClass instance;ですgetInstance()

于 2011-06-17T07:22:40.017 に答える