插值查詢的實現與總結(Java)
阿新 • • 發佈:2021-01-22
什麼是單例模式
單例模式是指系統中的某個類只能有一個物件例項。為了保證類只能有一個物件例項,那麼就不能在外部使用new關鍵字來進行例項化,這樣就必須將這個類的構造方法私有化。
單例模式的寫法有多種:
-
餓漢式
-
懶漢式(執行緒不安全)
-
懶漢式(執行緒安全)
-
雙重檢查
-
靜態內部類
-
列舉
其中懶漢式和雙重檢查由於效率問題,很少使用。
實現方式
餓漢式
實際工作中使用最多的就是餓漢式,程式碼如下:
public class SingletonHunger {
// 定義一個靜態變數來儲存建立好的物件例項
private static SingletonHunger instance = new SingletonHunger();
// 構造方法私有化
private SingletonHunger() {};
// 提供一個靜態方法給外部呼叫來獲取物件例項
public static SingletonHunger getInstance() {
return instance;
}
}
使用的時候呼叫類的靜態方法即可:
public class SingletonDemo {
public static void main(String[] args) {
// 獲取單例物件
SingletonHunger instance = SingletonHunger.getInstance();
}
}
在JDK中,java.lang.Runtime就是餓漢式單例模式 。
餓漢式在類裝載的時候就進行例項化,因此是執行緒安全的。但是如果例項化後一直不使用,則會造成記憶體浪費。
靜態內部類
為避免餓漢式可能會造成的記憶體浪費,可以使用靜態內部類的方式來建立單例,實現懶載入的效果。程式碼如下:
public class SingletonStatic {
private static class Inner{
private static final SingletonStatic INSTANCE = new SingletonStatic ();
}
private SingletonStatic() {};
public static SingletonStatic getInstance() {
return Inner.INSTANCE;
}
}
使用的時候呼叫類的靜態方法即可:
public class SingletonDemo {
public static void main(String[] args) {
SingletonStatic instance = SingletonStatic.getInstance();
}
}
靜態內部類方式在Singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getInstance方法,才會裝載類,從而完成Singleton的例項化。並且內部類的靜態屬性只會在第一次載入內部類的時候初始化 ,因此是執行緒安全的。
列舉
例項化類除了使用new關鍵字建立物件外,還可以使用反射和反序列化,如果要防止反射和反序列化重新建立物件 ,可以使用列舉類建立單例,程式碼如下:
public enum SingletonENUM {
INSTANCE;
public void getMessage() {
System.out.println("Hello World");
}
}
使用的時候呼叫列舉類的例項即可:
public class SingletonDemo {
public static void main(String[] args) {
SingletonENUM instance = SingletonENUM.INSTANCE;
}
}
雖然這種方式是最好的,但是在實際工作中反而是用得最少的,為什麼呢,因為太簡潔而導致可讀性太差。
歡迎關注我的公眾號,一起學習技術。