在Java中清除Singleton实例

Nam*_*ess 5 java singleton design-patterns

我有一个Singleton类来保存应用程序模块的状态.这个类只有很多带有setter和getter的类变量:

public class ModuleState{

private static ModuleState instance;

private A a;
private B b;
private C c;
..
..
..
..

private ModuleState (){}

public ModuleState getInstance(){
    if(instance==null)
        instance=new ModuleState();

    return instance;
}
Run Code Online (Sandbox Code Playgroud)

}

在应用程序生命周期的精确时刻,我需要清除模块的状态.我现在做的是通过clearAll()方法重置ModuleState中的所有变量,如下所示:

public void clearAll(){
    a=null;
    b=null;
    c=null;

    ..
    ..
}
Run Code Online (Sandbox Code Playgroud)

我的问题如下:有一个更简洁的方法来重置?可能清除单例实例本身,而不重置每个类变量?

这种方法的问题是我可能需要向ModuleState添加一个新的类变量.在这种情况下,我必须记住在clearAll()方法中添加一行来重置新变量.

Tri*_*mon 11

关于什么 ...

public static volatile ModuleState instance = null;

public static void reset() {
    instance = new ModuleState();
}
Run Code Online (Sandbox Code Playgroud)

ps:根据下面的讨论:在多线程环境中,同步对实例的访问非常重要,因为允许JVM 缓存其值.您可以使用volatile如上所示.谢谢大家!

干杯!

  • 单身人士不再是单身人士了.如果某些代码在某处缓存了getInstance()的结果,那么它将访问或修改该状态的先前版本.在选择此解决方案之前必须考虑这一点. (8认同)

rad*_*dai 2

不,这种方法是完全可以接受的。您当然以某种方式同步对这些状态对象的访问,对吗?否则,您可能会面临有人看到半清除的配置对象的风险。

为了防止将来添加任何额外的状态,您可以做的另一件事是将所有状态存储在 HashMap 中,例如,而不是单个字段。这样,clear()ing hashmap可以确保所有状态都被擦除,并且将来添加任何额外的状态变得更安全