老师你好,我发现你在测试之前编写的恶汉和懒汉单例时,在SimpleDemo里面都是直接打印了constructor.newInstance()的结果,也就是
System.out.println(StarvingSingleton.getInstance());
Class clazz = StarvingSingleton.class;
Constructor constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
System.out.println(constructor.newInstance());
这里的结果确实如你所说两个打印的结果不一样,说明这个StarvingSingleton的实例并不唯一。但是当你测试EnumStarvingSingleton的时候你是又强制转成了EnumStarvingSingleton,然后调用了getInstance()方法
System.out.println(StarvingSingleton.getInstance());
EnumStarvingSingleton enumStarvingSingleton = (EnumStarvingSingleton)constructor.newInstance();
System.out.println(enumStarvingSingleton.getInstance());
这里的结果也确实显示两个实例是同一个。
但是如果我在测试EnumStarvingSingleton的时候不用getInstance()方法,而是直接像你第一次测试的时候直接调用constructor.newInstance(),好像输出的结果还是非同一个实例。这样我还可以创建新的EnumStarvingSingleton实例,而非第一次创建的那个,那这个单例还有意义么?
另外我尝试把你第一次测试StarvingSingleton时用反射创建的实例强制转成StarvingSingleton,然后调用getInstance()方法,具体如下
System.out.println(StarvingSingleton.getInstance());
Class clazz = StarvingSingleton.class;
Constructor constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
StarvingSingleton starvingSingleton = (StarvingSingleton)constructor.newInstance();
System.out.println(starvingSingleton.getInstance());
结果还是相同的,所以我就有些疑惑是不是只要调用getInstance()方法我们就能保证是同一个实例了?
可能写的有点多,过于复杂,希望老师谅解。谢谢。