Реализация шаблона "одиночка" в Java

Кто-либо может обеспечить пример шаблона "одиночка" и объяснить, почему они необходимы?

9
задан z - 5 January 2010 в 21:08
поделиться

5 ответов

[

]Перед тем, как идти по однотонной трассе, подумайте еще раз. Вам действительно нужна одноэлементная операция? Если вы спрашиваете о сценариях, когда вам нужно реализовать синглоны, то это потому, что необходимость в них на самом деле не была выражена. Лучше не вводить синглеты в свою кодовую базу только потому, что это круто - следовать шаблонам дизайна.[

] [

][]Clean Code Talks - Global State and Singletons[][

] [

][]Once Is Not Enough[][

] [

][]Performant Singletons[][

] [

]Однако, что действительно стоит знать, так это []Dependency Injection[]. [

] [

] Теперь, если вы действительно хотите реализовать синглеты в Java, я бы порекомендовал Джошуа Блоха [] "Effective Java" [] способ их реализации: [

] [
public class Singleton
{
  public static Singleton getInstance() {
    return SingletonHolder.instance;
  }

  private Singleton() {}

  private static final class SingletonHolder {
    static final Singleton instance = new Singleton();    
  }
}
] [

] [] JLS[] гарантирует, что JVM не инициализирует экземпляр до тех пор, пока кто-нибудь не позвонит [] getInstance(); [][

] [

] Заключительное примечание: [] Double Checked Locking Pattern сломан в Java до Java 5[]. [] Модель памяти Java 5 делает поток DCL паттерна безопасным, но делает его медленнее, чем метод класса [] SingletonHolder[], в то время как первоначальным намерением была оптимизация производительности[]. [

] [

]EDIT: Как отметил @Luno, [] со второго издания книги, предпочтительным способом является:[][

] [
] [

]С версии 1.5 существует третий подход к реализации синглонов. Просто сделайте перечислительный тип с одним элементом:[

] [
] [
// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;

    public void leaveTheBuilding() { ... }
}
] [
] [

]Этот подход функционально эквивалентен подходу на общественном поле, за исключением того, что он более лаконичен, предоставляет механизм сериализации бесплатно и дает железную гарантию от множественных инстанцинаций, даже перед лицом изощренных сериализационных или рефлексивных атак. Хотя этот подход еще не получил широкого распространения, [] одноэлементный тип перечисления является наилучшим способом реализации одноэлементного. [][

] [
]
32
ответ дан 4 December 2019 в 06:41
поделиться

Одним из часто недооцениваемых мест, где хороши синглоны, является место, где нужно абстрагироваться от существования состояния. Примером может служить генератор случайных чисел. На уровне абстракции он просто генерирует случайные числа и не имеет состояния, о котором должен заботиться вызывающий абонент. На уровне реализации, однако, задействовано состояние. Другое - когда функция кэширует результаты или промежуточные вычисления, но хочется скрыть эту деталь от вызывающего абонента.

Здесь есть существенный компромисс. Если вы делаете вещи вроде этих синглонов, вы уменьшаете количество деталей реализации, о которых должен заботиться вызывающая вас функция, тем самым уменьшая связь в этом направлении. Однако в то же время вы сильно привязываете свою функцию к объекту-синглону, усложняя тестирование и т.д. Решение об использовании одиночной кнопки должно приниматься исходя из того, в каком направлении вы заботитесь об уменьшении связи более.

.
0
ответ дан 4 December 2019 в 06:41
поделиться
[

] В основном, в Java реализуется синглтон, предоставляя классу private no-args конструктор ([]private MyClass()[]), и статически (или лениво) инициализируя единственный экземпляр класса, который возвращается статическим []MyClass getInstance()[] методом. [

] [

] Это можно использовать, когда необходимо, чтобы во всем приложении было не более одного экземпляра класса.[

].
2
ответ дан 4 December 2019 в 06:41
поделиться
[

]danben имеет довольно неплохое обобщение того, что такое синглтон, поэтому я не буду повторять его.[

] [

]Что касается использования go, синглтоны часто представляют собой тонко завуалированные реализации глобальных переменных (что является плохой идеей). Они могут быть полезны для таких вещей, как маршрутизаторы сообщений или классы менеджера (среди прочего)[

].
1
ответ дан 4 December 2019 в 06:41
поделиться
[

]'[]Просто одиночка []' в []JavaWorld[][

] [

]И если вы действительно хотите попасть в окопы, начните читать о "static vs singleton" в группах [][], или Google. Всегда актуальная тема! [

]
0
ответ дан 4 December 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: