Обобщенный базовый класс Singleton в Java - PullRequest
2 голосов
/ 27 мая 2009

В C ++ я понимаю, что можно создать базовый класс Singleton, используя шаблоны. Он описан в книге Андрея Александреску «Современный дизайн C ++».

Может ли что-то подобное быть достигнуто в Java?

Ответы [ 5 ]

3 голосов
/ 27 мая 2009

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

В результате шаблон Singleton не будет иметь большого значения в Java.

3 голосов
/ 27 мая 2009

Мне еще предстоит найти удовлетворительное решение для этого на Java. Существует множество примеров использования шаблонов в C ++ или обобщений в .NET, но реализация обобщений Java имеет некоторые ограничения для статических членов, которые затрудняют это.

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

Для реализации см. этот пост .

2 голосов
/ 27 мая 2009

Да, но у всех подходов есть свои недостатки. Они либо дороги (используют synchronized), либо делают тестирование невозможным (final static).

Смотрите ссылки справа:

«Современное состояние» заключается в использовании контейнера или фабрики, которая создает синглтоны по мере необходимости и хранит их в каком-то тайнике. См. Весна, Guice и т. Д.

1 голос
/ 10 июля 2018

Вы можете использовать статический HashMap (или Hashtable для безопасности потоков), чтобы хранить все экземпляры для разных шаблонов, как упоминалось в @ reed-copsey. Пример класса Singleton:

public class Singleton<T extends Parent> {
    private static HashMap<Class, Singleton> instanceMap = new HashMap<Class, Singleton>();

    private Singleton() {

    }

    public static <T> Singleton getInstance(Class<T> tClass) {
        if (!instanceMap.containsKey(tClass))
            instanceMap.put(tClass, new Singleton());
        return instanceMap.get(tClass);
    }

}

Вы можете использовать этот синглтон как:

public static void main(String[] args) {
    Singleton instance1 = Singleton.getInstance(Child1.class);
    Singleton instance2 = Singleton.getInstance(Child1.class);
    assert instance1 == instance2;

    Singleton instance3 = Singleton.getInstance(Child2.class);
    assert instance1 != instance3;
}

Класс Singleton будет возвращать разные экземпляры для разных типов классов.

1 голос
/ 27 мая 2009

В 1997 году я попытался сделать это с JDK 1.0.2 и пришел к выводу, что невозможно создать наследуемый синглтон. Насколько я могу судить, Java не получила никаких новых функций, которые позволили бы это.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...