package test;
public class Singleton {
private static Singleton singleton;
private Singleton(){
System.out.println("只操作一次!");
}
public static class SingletonHelper{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
singleton = SingletonHelper.INSTANCE;
return singleton;
}
public static Singleton getInstance2(){
singleton = new Singleton();
return singleton;
}
public static Singleton getInstance3(){
final Singleton singleton3 = new Singleton();
return singleton;
}
}
package test;
import org.junit.Test;
public class TestSingleton {
@Test
public void testSingleton(){
for(int i=0;i<5;i++){
//Singleton.getInstance();
//Singleton.getInstance2();
Singleton.getInstance3();
}
}
}
这是getInstance2();的结果,会new Singleton();多次
而

只会执行一次
根本原因在于:
静态内部类里面使用的是
static final Singleton INSTANCE = new Singleton();
static final 是一个静态常量,存储在内存中的常量区,在new之前会看常量里面是否有这个值,如果有,就不再执行new操作了
已经在成员变量中被定义成static了,
不能被重复定义,所以singleton仍然是静态变量,
虽然这个值在内存中同时只有一个,但是这个值是可以变的,所以可以被重新赋值,
所以会先new,再赋值给singleton,这样就不是单例的
若是把这个变量直接定在方法体内,那么这个变量就是局部变量了,其他的类没办法直接通过类名访问,

