如何多次实例化Singleton?

7 java singleton

我的代码中需要一个单例.我用Java实现它,它运行良好.我这样做的原因是为了确保在多个环境中,这个类只有一个实例.

但现在我想用Unit测试在本地测试我的Singleton对象.出于这个原因,我需要模拟这个Singleton的另一个实例(来自另一个设备的对象).那么有可能第二次实例化Singleton用于测试目的还是我必须嘲笑它​​?

我不确定,但我认为可以使用不同的类加载器?

Sjo*_*erd 17

传统上,Singleton创建自己的实例,并且只创建一次.在这种情况下,无法创建第二个实例.

如果使用依赖注入,则可以让框架为您创建单例.单例不会防止其他实例(即它有一个公共构造函数),但依赖注入框架只实例化一个实例.在这种情况下,您可以创建更多用于测试的实例,并且您的对象不会被单例代码混乱.


Ode*_*ded 16

Singleton的观点是你只能实例化一次.

  • @Sebi - 然后用它测试.或者在没有它的情况下使用模拟测试,但不要尝试使它不是. (3认同)

Abh*_*kar 9

您可以使用反射调用单例类的私有构造函数来创建类的新实例.

class MySingleton {
    private MySingleton() {
    }
}

class Test {
    public void test() throws Exception {
        Constructor<MySingleton> constructor = MySingleton.class.getConstructor();
        constructor.setAccessible(true);
        MySingleton otherSingleton = constructor.newInstance();
    }
}
Run Code Online (Sandbox Code Playgroud)


JSB*_*ոգչ 6

根据定义,单例只能实例化一次.但是,您的单元测试需要两个单例这一事实强烈表明您的对象不应该是一个单例,并且您应该重新考虑单例设计.