為什么要用靜態內部類來實現單例模式?


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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM