Как инициировать синглет с данными только один раз? - PullRequest
1 голос
/ 06 июля 2011

Это, вероятно, элементарно, но у меня есть проблема, решающая это.
У меня есть синглтон, и при каждом вызове метода я отправляю объект. тот самый.

так это выглядит так:

  mySingletone.getInstance.doSomethingXXX(MyObj)
  mySingletone.getInstance.doSomethingYYY(MyObj)

Теперь я хочу прекратить посылку и положить ее в синглетон.
У меня есть несколько дополнительных решений -
1. установите его сразу после первого вызова getinstance.
очень плохо - потому что я не уверен, когда будет в первый раз.
2. Я могу стереть реализацию синглетона и отправить ее в публичный ctor - но тогда я не буду уверен, что она будет создана только один раз.

Есть ли способ инициировать синглет только один раз?

Ответы [ 2 ]

1 голос
/ 25 января 2013

Проверьте идиому держателя инициализации по требованию, чтобы узнать, как лучше всего реализовать одноэлементный шаблон в Java.

http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom

Вы можете просто установить значение в вашем приватном конструкторе, которое должно вызываться только один раз.

0 голосов
/ 03 октября 2014

Если вашему классу Singleton нужно делать что-то с другим MYObj, вам следует продолжать делать то, что вы делаете.
Если синглтон всегда должен использовать один и тот же экземпляр MyObj (я думаю, это то, о чем вы просите), вы можете создать его экземпляр в своем синглтоне (было бы лучше, потому что он был бы инкапсулирован / скрыт от клиента. ( вы даже можете инкапсулировать класс MyObj внутри этого класса)
Например:

public class MySingleton {
   private static MySingleton _instance = new MySingleton();

   private MyObj _myObj = new MyObj(); 
   private MySingleton() { 
       //set more stuff into _myObj if necessary
   }
/* 
   //similarly you can replace the above 4 lines of code with this code:
   private MyObj _myObj;
   private MySingleton() { 
       _myObj = new MyObj(); 
       //set more stuff into _myObj if necessary
   }
*/

   private static MySingleton getInstance() { return _instance; }

   //other methods of the class use _myObj
   // ...
   //could even define MyObj class nested in this class
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...