Java單例模式實現(xiàn)靜態(tài)內(nèi)部類方法示例
Singleton是眾多設計模式中最容易理解的一種,也是眾多設計模式中較為重要的一種設計模式。接下來我們看看具體介紹。
Singleton模式實現(xiàn)的重點在于將構(gòu)造函數(shù)私有化(private),并通過提供靜態(tài)公有函數(shù)(public synchronized static xxx getInstance)來獲取定義在類中的靜態(tài)私有成員(private static xxx instance),通過一個簡單的判斷靜態(tài)實例是否為空來控制這個類只能夠new一次,即控制了一個類只能有單個實例,一般的實現(xiàn)如下代碼所示:
package com.study.dp.singleton;
/**
* 傳統(tǒng)方式實現(xiàn)單例模式
* @author CrazyPig
*
*/
public class TraditionalSingletion {
// 單實例
private static TraditionalSingletion instance;
// 不讓new
private TraditionalSingletion() {
System.out.println("private TraditionalSingletion()");
}
public synchronized static TraditionalSingletion getInstance() {
System.out.println("TraditionalSingletion getInstance()");
if(instance == null) {
System.out.println("instance = new TraditionalSingletion()");
instance = new TraditionalSingletion();
}
return instance;
}
public static void main(String[] args) {
TraditionalSingletion instance = TraditionalSingletion.getInstance();
System.out.println("========================================");
TraditionalSingletion instance01 = TraditionalSingletion.getInstance();
System.out.println("========================================");
TraditionalSingletion instance02 = TraditionalSingletion.getInstance();
}
}
今天偶然在一篇文章中看到另外一種巧妙的做法,通過將這個單實例的引用變量定義在靜態(tài)內(nèi)部類中,來實現(xiàn)單例,這樣可以做到不用if條件進行判斷,并且是多線程安全的(由jvm保證)。這個特殊的做法如下所示:
package com.study.dp.singleton;
/**
* 靜態(tài)內(nèi)部類實現(xiàn)單例模式
* @author CrazyPig
*
*/
public class SpecialSingleton {
// 靜態(tài)內(nèi)部類
private static class NestClass {
private static SpecialSingleton instance;
static {
System.out.println("instance = new SingletonTest()");
instance = new SpecialSingleton();
}
}
// 不能直接new
private SpecialSingleton() {
System.out.println("private SingletonTest()");
}
public static SpecialSingleton getInstance() {
System.out.println("SingletonTest getInstance()");
return NestClass.instance;
}
public static void main(String[] args) {
SpecialSingleton instance = SpecialSingleton.getInstance();
System.out.println("========================================");
SpecialSingleton instance01 = SpecialSingleton.getInstance();
System.out.println("========================================");
SpecialSingleton instance02 = SpecialSingleton.getInstance();
}
}
當?shù)谝淮我胓etInstance()方法的時候,訪問靜態(tài)內(nèi)部類中的靜態(tài)成員變量,此時該內(nèi)部類需要調(diào)用static代碼塊(因為首次訪問該類)。而后再次訪問getInstance()方法會直接返回instace引用。這種做法相對于傳統(tǒng)做法更加巧妙。
總結(jié)
以上就是本文關(guān)于Java單例模式實現(xiàn)靜態(tài)內(nèi)部類方法示例的全部內(nèi)容,希望對大家有所幫助,感興趣的朋友可以參閱本站其他專題。
相關(guān)文章
Java?MapStruct優(yōu)雅地實現(xiàn)對象轉(zhuǎn)換
MapSturct?是一個生成類型安全,高性能且無依賴的?JavaBean?映射代碼的注解處理器,用它可以輕松實現(xiàn)對象轉(zhuǎn)換,下面就來和大家聊聊具體操作吧2023-06-06
基于Spring Cloud Zookeeper實現(xiàn)服務注冊與發(fā)現(xiàn)
這篇文章主要介紹了基于Spring Cloud Zookeeper實現(xiàn)服務注冊與發(fā)現(xiàn),幫助大家更好的理解和學習spring框架,感興趣的朋友可以了解下2020-11-11
解決fastjson從1.1.41升級到1.2.28后報錯問題詳解
這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報錯問題詳解,需要的朋友可以參考下2020-02-02

