为什么要用静态内部类来实现单例模式?

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,这样就不是单例的
若是把这个变量直接定在方法体内,那么这个变量就是局部变量了,其他的类没办法直接通过类名访问,


原文地址:https://www.cnblogs.com/javaboy2018/p/9040803.html