單例模式簡介及由它引出的JAVA局部靜態變量問題

  單例模式確保一個類只有一個實例,自行提供這個實例並向整個系統提供實例。
單例模式類的特點:
  • 只能有一個實例;
  • 自己創建這個實例;
  • 整個系統都使用這個實例。
先看一般的單例模式類,類名爲SingletonClass,定義如下:
public class SingletonClass {

    private static SingletonClass singleton;
   
    private SingletonClass(){

    }
    public static  SingletonClass getInstance(){
        if(singleton == null){
            singleton = new SingletonClass();
        }
        System. out.println(singleton);
        return singleton ;
    }
}
在類中定義了一個SingletonClass類對象引用singleton,注意它前面的關鍵字static,表明他是靜態變量。同時,注意類的構造函數的作用域是private,這樣做的目的是使得要得到該類的實例只能通過後面的靜態方法getInstance()得到。
     下面定義一個測試類Test,其定義如下:
public class Test {

    public static void main(String[] args) {

        System. out.println("singletoninstance1" );
        SingletonClass. getInstance();
        System. out.println("singletoninstance2" );
        SingletonClass. getInstance();  
    }
}
測試結果如下:
singletoninstance1
com.learning.singleton.SingletonClass@c17164
singletoninstance2
com.learning.singleton.SingletonClass@c17164
注意兩次得到的對象是同一個。
     我們可以做些嘗試,修改下類,比如將對象引用定義爲 private SingletonClass singleton,這樣得到的結果是:在getInstance方法中會報錯Cannot make a static reference to the non-static field singleton,大概的意思是不能將靜態引用賦值給飛靜態變量singleton。但問題是在方法中語句new SingletonClass();返回的是靜態引用嗎?這個咱們再做個測試,在方法中定義一個對象,然後將其引用賦給singleton:


還是報同樣的錯誤Cannot make a static reference to the non-static field singleton,這是什麼原因呢?難道說在靜態方法中創建的對象引用也是靜態的嗎?
     在網上查的些資料說靜態方法中的變量只是局部變量,從上面的例子看似乎沒那麼簡單。也有說靜態方法中的變量就是靜態的,這種說法有點符合上面的測試結果,但是在方法外部又訪問不了該變量。那到底靜態方法中的變量到底是什麼呢?只能說它是局部靜態變量了。也不知道這樣講是否正確,希望大家指正。
     最後注意下getInstance()方法中的if判斷語句,在這個例子中如果少了該判斷那就會產生多個實例了,也違背了單例模式的思想了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章