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,這樣就不是單例的
若是把這個變量直接定在方法體內,那么這個變量就是局部變量了,其他的類沒辦法直接通過類名訪問,

