Во многих языках программирования существует механизм глобальных переменных, помимо области размещения в памяти, они обладают свойством всеобщей доступности – в Java таких переменных нет. Зачем это может понадобиться нам, крутым проектировщикам, ведь глобальные переменные – зло? – А я хочу параметры настройки один раз читать из файла и потом их отовсюду использовать.
Следующая ситуация – иногда хочется иметь гарантию того, что будет создан только один экземпляр класса. Например, я кеширую данные или управляю соединением с БД.
Как решить эти проблемы – на помощь приходит шаблонное решение, который мы и обсудим.
Singleton – класс не имеющий доступного конструктора и создающийся путем вызова статического метода.
Реализация приписываемая Майерсу:
class God {
private static God ourInstance;
private God(){}
public static God getInstance(){
if(ourInstance == null){
ourInstance = new God();
}
return ourInstance;
}
}
Для сокращения количества строк (на 3 штуки – 30%!) и просветления можно использовать строку
return ourInstance == null ? ourInstance = new God() : ourInstance;
"Создавать" объект теперь надо так:
God foo = God.getInstance();
Стоит отметить что злоупотреблять таким решением не стоит, но учить надо.
Совсем забыл - существует альтернативное, простое, но менее гибкое решение. Жду предложения)
Альтернативное решение - использование static методов.
ОтветитьУдалить(Все почему-то стараются высказывать предположения в личных сообщениях)
альтернативная решения есть вот оно, а воше оно есть и на wiki
ОтветитьУдалитьтам есть ишю один пример но я использую этот пример
public class Singleton {
protected Singleton() {}
private static class SingletonHolder {
public static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
во втором решение больше не исполизуется if оператор eто улутшает performance VM машине;
ОтветитьУдалить