这不是讨论Singleton是好还是坏。这是关于创建单身人士。我理解辛格尔顿的方式是,它是一个在任何时候都应该存在多于一个对象的类。这就是说,如果几个类同时实例化一个单例,那么它们将共享该单例的单个实例。
单身人员的问题在于,一旦创建它,它将在应用程序的持续时间内存在。使用我的方法,您可以创建并随时收集单身垃圾,如果它不再被使用。那么我需要一个枚举(Singleton!)来创建所有其他的Singleton。我认为我的方法是反射和序列化安全,但我不确定线程是否有问题。
我的方法来创建单情况如下:这是创建Singleton线程安全的方法吗?
首先任何类,它想成为单身必须扩展以下类
public abstract class Singleton {
public Singleton(SingletonFactory.SingletonParam singletonParam) {
if (singletonParam == null) {
throw new NullPointerException("singletonParam cannot be null)");
}
}
// For singleton to release resources.
public abstract void destroy(SingletonFactory.SingletonParam singletonParam);
}
SingletonParam将是不能有一个抽象类,内部类对象,它是一个多态意义上的SingletonParam,在其容器类的外部实例化。
这不是要让子类在运行时扩展Singleton类。它是由具有静态实例的单例类组成的。我的方法不需要单例类的任何静态实例。
容器是下面的类
注:读斯蒂芬C中的答案后,我作出改变,以初始化从构造函数中的HashMap和我不明白为什么它不是线程安全的。
public enum SingletonFactory {
INSTANCE;
enum SingletonList {
A,
B,
......
}
private final HashMap<String, SingletonInfo> mfSingletonInfoHashMap = new HashMap<>();
// Added after @Stephen C answer
SingletonFactory() {
mfSingletonInfoHasmap.put(A, final new SingletonInfo());
// put all the members of the SingletonList here.
At this time the Singleton member of the SingletonInfo is null.
It will be instantiated when a class call getSingleton
}
private class SingletonInfo {
final Set callingObjects = new HashSet();
Singleton singleton;
}
public Object getSingleton(SingletonList inList, Object object) {
final SingletonInfo singletonInfo = mfSingletonInfoHashMap.get(inList);
synchronized (singletonInfo) {
if (singletonInfo.callingObjects.add(object)) {
if (singletonInfo.singleton == null) {
singletonInfo.singleton = createSingleton(singletonClassName);
}
} else {
throw new RuntimeException("getSingleton(" + singletonClassName + ") has already been called and not released");
}
return singletonInfo.singleton;
}
public void releaseSingleton(SingletonList inList, Object object) {
SingletonInfo singletonInfo = mfSingletonInfoHashMap.get(inList);
synchronized (singletonInfo) {
singletonInfo.callingObjects.remove(object);
if (singletonInfo.callingObjects.isEmpty()) {
singletonInfo.singleton.destroy(new SingletonParam() {
});
singletonInfo.singleton = null;
}
}
}
private Singleton createSingleton(SingletonList inList) {
switch(inList) {
case SingletonA:
return new SingletonA(new SingletonParam() {});
......
}
}
public abstract class SingletonParam {
private SingletonParam() {
}
}
}
远高于并不完全正确,因为你必须扩展包含在SingletonInfo的CallingObjects落实参考平等和默认实现不等于HashSet的。
由于一个子类的实例无法通过调用SingletonFactory.INSTANCE.getSingleton(you_singleton_class_name, this)
你为什么不使用'WeakReference'? – shmosel
WeakReference是什么? –
给你想要成为垃圾收集者的单身人士。 – shmosel