Java如何销毁单例模式实例

7

我有一个单例模式,创建方法如下:

private static class SingletonHolder { 
    public static Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance() {
    return SingletonHolder.INSTANCE;
}

我希望在特定时间重置单例实例。(我确定此时重置单例实例是安全的)。我尝试删除final说明符,并在想要重置它时将实例设置为null,但问题是如何获取另一个实例(它将保持null)。
另一个问题是在SingletonHolder中删除final说明符是否安全。
谢谢

那么谁将重置单例状态?是单例类还是外部人员?! - user2511414
在这种情况下(需要完全新的对象实例),我认为您不需要单例模式,而是需要一个工厂。 - Konstantin Yovkov
4
你当前的类根本不是单例。它仍然有一个public构造函数。 - Rohit Jain
你尝试过添加一个“reset”方法吗? - Meesh
2个回答

5
如果你确实需要重置一个单例实例(其实这并没有太多意义),你可以将其所有内部成员封装在一个私有对象中,并通过显式的initialize()reset()方法重新初始化。 这样,您就可以保留单例实例并提供某种“重置”功能。

听起来不错。实际上,我考虑过重置为一个新实例而不是 null。问题在于,我百分之百确定在重置时只有一个线程会访问单例。感谢您的帮助。 - user1603602
在这种情况下,单例仍然不为null。也就是说,如果你调用getInstance(),你将再次得到相同的实例... - Mehdi

2
你需要提供一个包可见(默认访问级别)的方法,让其他类能够重置单例,就像这样:
class SingleGuy{
 private static SingleGuy=new SingleGuy();//eager init mode
 synchronized static void initTheGuy(){
  SingleGuy=new SingleGuy();//while this not recommended!
 }
 synchronized static void resetTheInstance(){
  /*Reset the singleton state as you wish. just like you reinitialized*/
 } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接