Общий класс для синглтона
В настоящее время я пишу программу, в которой около 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);