Java單例模式實現(xiàn)靜態(tài)內(nèi)部類方法示例
Singleton是眾多設(shè)計模式中最容易理解的一種,也是眾多設(shè)計模式中較為重要的一種設(shè)計模式。接下來我們看看具體介紹。
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(); } }
當(dāng)?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)服務(wù)注冊與發(fā)現(xiàn)
這篇文章主要介紹了基于Spring Cloud Zookeeper實現(xiàn)服務(wù)注冊與發(fā)現(xiàn),幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下2020-11-11解決fastjson從1.1.41升級到1.2.28后報錯問題詳解
這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報錯問題詳解,需要的朋友可以參考下2020-02-02