Java 单身人士通用类
我目前正在编写一个程序,其中大约有12个类需要是单例的,因为它们使用的是需要不同类型的消息传递服务。我的问题是,不是基本上复制和粘贴每个实例的单例代码来创建一个实例,而只是更改它创建实例的类。对于任何需要创建单例的类,是否有某种方法可以为单例模式使用公共代码 下面是创建其中一个单例的代码Java 单身人士通用类,java,design-patterns,singleton,common-code,Java,Design Patterns,Singleton,Common Code,我目前正在编写一个程序,其中大约有12个类需要是单例的,因为它们使用的是需要不同类型的消息传递服务。我的问题是,不是基本上复制和粘贴每个实例的单例代码来创建一个实例,而只是更改它创建实例的类。对于任何需要创建单例的类,是否有某种方法可以为单例模式使用公共代码 下面是创建其中一个单例的代码 public static void create() { if(instance == null) { instance = new FooDataWriter();
public static void create()
{
if(instance == null)
{
instance = new FooDataWriter();
}
}
您必须复制并粘贴用于实现singleton的任何代码,但根据有效Java(第二版,第18页),实施singleton的最佳方法是使用单元素枚举:
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;
}
}
}
这也是一个好主意!我只是希望有一种方法可以让单身人士共享一些公共库,如果将来有什么变化,他们不必到处修改代码,但我想没有办法了。@jgr208很遗憾,我认为没有办法。使用枚举的缺点是不能使用
MySingleton extends…
。显然,实现非枚举的单例的最佳方法是:不要生气,但是如果您有12个单例,那么您的设计可能有问题。@HenriqueBarcelos遗憾的是,我们没有,我们使用的是RTI DDS,并且每种消息类型都有自己的类型。就像A是它自己的类型,B是它自己的类型。因此,我们想为每种类型制作一个单独的对象,这样我们就不会在不需要的时候制作一堆对象。如果您可能感兴趣,请查看该模式
FooDataWriter instance = Singletons.get(FooDataWriter.class);