单例常见 class
Common class for singleton
我目前正在编写一个程序,其中大约 12 个 classes 需要是单例,因为它们正在使用需要不同类型的消息服务。我的问题是,而不是基本上复制和粘贴每个实例的单例代码来创建一个实例,只更改 class 它创建一个实例。对于任何需要创建单例的class,是否有用于单例模式的通用代码?
这是创建其中一个单例的代码,
public static void create()
{
if(instance == null)
{
instance = new FooDataWriter();
}
}
您必须复制并粘贴用于实现单例的任何代码,但根据 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);
我目前正在编写一个程序,其中大约 12 个 classes 需要是单例,因为它们正在使用需要不同类型的消息服务。我的问题是,而不是基本上复制和粘贴每个实例的单例代码来创建一个实例,只更改 class 它创建一个实例。对于任何需要创建单例的class,是否有用于单例模式的通用代码?
这是创建其中一个单例的代码,
public static void create()
{
if(instance == null)
{
instance = new FooDataWriter();
}
}
您必须复制并粘贴用于实现单例的任何代码,但根据 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);