Общий класс для синглтона

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

Вот код для создания одного из синглетонов,

public static void create()
{
    if(instance == null)
    {
        instance = new FooDataWriter();
    }
}

2 ответа

Решение

Вы должны скопировать и вставить любой код, который вы используете для реализации синглтона, но в соответствии с Effective Java (2-е издание, стр.18) лучший способ обеспечить использование синглтона - это использовать одноэлементное перечисление:

public enum MySingleton {
    INSTANCE;

    // methods
}

Если вы делаете это таким образом, копировать и вставлять практически нечего!

Ну как то так возможно

public final class Singletons {

    private static final Map<Class<?>, Object> map = new HashMap<>();

    private Singletons() {
    }

    public static <T> T get(Class<T> type) {
        Object instance = map.get(type);
        if (instance != null) {
            return (T) instance;
        }
        synchronized (map) {
            instance = map.get(type);
            if (instance != null) {
                return (T) instance;
            }
            try {
                instance = type.newInstance();
            } catch (Exception e) {
                throw new IllegalArgumentException("error creating instance");
            }
            map.put(type, instance);
            return (T) instance;
        }
    }
}

Тогда вы могли бы сделать просто:

FooDataWriter instance = Singletons.get(FooDataWriter.class);
Другие вопросы по тегам