Java單例模式實(shí)現(xiàn)靜態(tài)內(nèi)部類方法示例
Singleton是眾多設(shè)計(jì)模式中最容易理解的一種,也是眾多設(shè)計(jì)模式中較為重要的一種設(shè)計(jì)模式。接下來(lái)我們看看具體介紹。
Singleton模式實(shí)現(xiàn)的重點(diǎn)在于將構(gòu)造函數(shù)私有化(private),并通過(guò)提供靜態(tài)公有函數(shù)(public synchronized static xxx getInstance)來(lái)獲取定義在類中的靜態(tài)私有成員(private static xxx instance),通過(guò)一個(gè)簡(jiǎn)單的判斷靜態(tài)實(shí)例是否為空來(lái)控制這個(gè)類只能夠new一次,即控制了一個(gè)類只能有單個(gè)實(shí)例,一般的實(shí)現(xiàn)如下代碼所示:
package com.study.dp.singleton; /** * 傳統(tǒng)方式實(shí)現(xiàn)單例模式 * @author CrazyPig * */ public class TraditionalSingletion { // 單實(shí)例 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(); } }
今天偶然在一篇文章中看到另外一種巧妙的做法,通過(guò)將這個(gè)單實(shí)例的引用變量定義在靜態(tài)內(nèi)部類中,來(lái)實(shí)現(xiàn)單例,這樣可以做到不用if條件進(jìn)行判斷,并且是多線程安全的(由jvm保證)。這個(gè)特殊的做法如下所示:
package com.study.dp.singleton; /** * 靜態(tài)內(nèi)部類實(shí)現(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()方法的時(shí)候,訪問(wèn)靜態(tài)內(nèi)部類中的靜態(tài)成員變量,此時(shí)該內(nèi)部類需要調(diào)用static代碼塊(因?yàn)槭状卧L問(wèn)該類)。而后再次訪問(wèn)getInstance()方法會(huì)直接返回instace引用。這種做法相對(duì)于傳統(tǒng)做法更加巧妙。
總結(jié)
以上就是本文關(guān)于Java單例模式實(shí)現(xiàn)靜態(tài)內(nèi)部類方法示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助,感興趣的朋友可以參閱本站其他專題。
相關(guān)文章
Spring入門實(shí)戰(zhàn)之Profile詳解
什么是spring profile?簡(jiǎn)單講profile就是一組配置,不同profile提供不同組合的配置,程序運(yùn)行時(shí)可以選擇使用哪些profile來(lái)適應(yīng)環(huán)境。下面這篇文章主要介紹了Spring中Profile實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考借鑒。2017-02-02Java?MapStruct優(yōu)雅地實(shí)現(xiàn)對(duì)象轉(zhuǎn)換
MapSturct?是一個(gè)生成類型安全,高性能且無(wú)依賴的?JavaBean?映射代碼的注解處理器,用它可以輕松實(shí)現(xiàn)對(duì)象轉(zhuǎn)換,下面就來(lái)和大家聊聊具體操作吧2023-06-06Spring Boot開啟遠(yuǎn)程調(diào)試的方法
這篇文章主要介紹了Spring Boot開啟遠(yuǎn)程調(diào)試的方法,幫助大家更好的理解和使用Spring Boot框架,感興趣的朋友可以了解下2020-10-10JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn)
本文主要介紹了JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09基于Spring Cloud Zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)
這篇文章主要介紹了基于Spring Cloud Zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn),幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下2020-11-11解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問(wèn)題詳解
這篇文章主要介紹了解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問(wèn)題詳解,需要的朋友可以參考下2020-02-02SpringBoot整合log4j2日志的實(shí)現(xiàn)
在項(xiàng)目推進(jìn)中,如果說(shuō)第一件事是搭Spring框架的話,那么第二件事情就是在Sring基礎(chǔ)上搭建日志框架,大家都知道日志對(duì)于一個(gè)項(xiàng)目的重要性,尤其是線上Web項(xiàng)目,因?yàn)槿罩究赡苁俏覀兞私鈶?yīng)用如何執(zhí)行的唯一方式。此篇文章是博主在實(shí)踐中用Springboot整合log4j2日志的總結(jié)2021-06-06