С практической точки зрения для Gin область применения Singleton наиболее целесообразна, если рассматривать ее для каждого экземпляра клиента или даже более точно для каждого экземпляра Ginjector. Если вы допустите ошибку, сделав два Ginjectors, GWT.create
дважды используя экземпляр, у вас, вероятно, будет один 'singleton' на экземпляр, поскольку каждый Ginjector может отслеживать только экземпляры, которыми он управляет.
Таким образом, каждый раз, когда ваше приложение загружается, оно будет иметь свой собственный синглтон. Если пользователь дважды открывает одно и то же приложение на двух разных вкладках, у каждой будет свой собственный синглтон. Вы можете рассматривать каждую вкладку как собственную JVM, так как она будет иметь собственную копию всех классов и не сможет общаться или вызывать методы * в другом окне.
Без контекста, да, по умолчанию каждый экземпляр отличается. Когда тип @Inject
ed, он будет новым экземпляром, но если вы @Inject
a Provider
для поля, каждый раз, когда вы вызываете get()
, вы можете получить новый экземпляр. Это может быть полезно, чтобы легко получить несколько новых внедренных экземпляров.
Синглеты имеют смысл использовать в двух основных случаях
- Когда экземпляр содержит общее состояние, которое должно быть общим для многих инъекций - наиболее распространенный случай.
- Когда создание экземпляра стоит дорого - на сервере это часто делается как пул, поэтому создается не более X объектов, но дорогие объекты на клиенте, как правило, являются представлениями с большим количеством виджетов и, как правило, более одного не требуется.
* Можно вызывать методы в другом окне, но для этого нужно использовать возможности браузера, публикуя сообщение, а не просто передавая объект туда-сюда.