Синглтон в проекте GWT - PullRequest
1 голос
/ 17 июня 2011

Может кто-нибудь объяснить мне что-нибудь.Вот некоторый сценарий.

Предположим, у меня есть шаблон класса и я использую 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)

и т. Д.

Итак, Template является singleton и насколько язнаете, единичный экземпляр - это один для каждой виртуальной машины, то есть общий для всего приложения, верно?Шаблон класса имеет заголовок, меню и контент, идея состоит в том, чтобы перезагрузить только часть контента в качестве очистки и добавления виджетов.Но хороший ли это подход?

Например, может ли у нас быть ситуация, подобная пользователю "A" setContent (widgetA), но в то же время пользователь "B" использует метод setContent (widgetB), так что же здесь произойдет?

Спасибо, если кто-нибудь в конце концов поделится со мной хорошим подходом и прокомментирует его.

С уважением

Ответы [ 3 ]

12 голосов
/ 17 июня 2011

@Singleton относится к экземпляру Ginjector (да, если вы дважды GWT.create() свой GInjector, вы получите два "одиночных"). Нет единого значения, что GIN может каким-то образом «перехватить» ваш new Template() в onModuleLoad, поэтому injector.getTemplate() вернет отдельный экземпляр template. (это полностью отличается от «анти-паттерна одноэлементного кода», о котором говорит Стейн, используя static состояние)

В этом нет магии: GIN - это генератор кода, он пишет только тот код, который вы могли набрать вручную.

Что касается других ваших вопросов:

  • Ваш клиентский код явно выполняется на клиенте, то есть в браузере. В каждой вкладке / окне браузера есть один «экземпляр приложения», отображающий ваше приложение. Там нет "пользователь A" и "пользователь B" одновременно.
  • JavaScript является однопоточным, поэтому вам не нужно опасаться одновременного доступа.
1 голос
/ 17 июня 2011

Я ввел класс с общим кодом RPC для нашего приложения.Вот как:

@Singleton
public class SomeService {

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

...

}

Наш модуль Gin:

public class MyGinModule extends AbstractGinModule {

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

}

И он вводится как синглтон следующим образом:

public class ApplicationInfoPresenter {

@Inject
private SomeService service;

...
...

}
0 голосов
/ 17 июня 2011

Я почти уверен, что аннотация игнорируется компилятором GWT.

Когда мне нужен Singleton в gwt, я просто создаю класс с закрытым / защищенным конструктором, а private static NameOfSingletonClass instance; и a getInstance() метод, который инициализирует экземпляр, если null, и возвращает экземпляр.

...