欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java單例模式實(shí)現(xiàn)靜態(tài)內(nèi)部類方法示例

 更新時(shí)間:2017年09月26日 09:05:23   作者:ZzzCrazyPig  
這篇文章主要介紹了Java單例模式實(shí)現(xiàn)靜態(tài)內(nèi)部類方法示例,涉及構(gòu)造函數(shù)私有化等相關(guān)內(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)文章

  • Java中I/O輸入輸出的深入講解

    Java中I/O輸入輸出的深入講解

    Java的I/O技術(shù)可以將數(shù)據(jù)保存到文本文件、二進(jìn)制文件甚至是ZIP壓縮文件中,以達(dá)到永久性保存數(shù)據(jù)的要求,下面這篇文章主要給大家介紹了關(guān)于Java中I/O輸入輸出的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Spring入門實(shí)戰(zhàn)之Profile詳解

    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-02
  • Java?MapStruct優(yōu)雅地實(shí)現(xiàn)對(duì)象轉(zhuǎn)換

    Java?MapStruct優(yōu)雅地實(shí)現(xiàn)對(duì)象轉(zhuǎn)換

    MapSturct?是一個(gè)生成類型安全,高性能且無(wú)依賴的?JavaBean?映射代碼的注解處理器,用它可以輕松實(shí)現(xiàn)對(duì)象轉(zhuǎn)換,下面就來(lái)和大家聊聊具體操作吧
    2023-06-06
  • Spring Boot開啟遠(yuǎn)程調(diào)試的方法

    Spring Boot開啟遠(yuǎn)程調(diào)試的方法

    這篇文章主要介紹了Spring Boot開啟遠(yuǎn)程調(diào)試的方法,幫助大家更好的理解和使用Spring Boot框架,感興趣的朋友可以了解下
    2020-10-10
  • JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn)

    JAVA區(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中HandlerMapping的使用

    淺談Spring中HandlerMapping的使用

    這篇文章主要介紹了淺談Spring中HandlerMapping的使用,Spingmvc中的HandlerMapping負(fù)責(zé)解析請(qǐng)求URL,對(duì)應(yīng)到Handler進(jìn)行處理,這里的Handler一般為Controller里的一個(gè)方法method,也可以為servlet或者Controller等,需要的朋友可以參考下
    2023-08-08
  • Mybatis分解式查詢使用方法

    Mybatis分解式查詢使用方法

    這篇文章主要介紹了Mybatis分解式查詢使用方法,分解式查詢就是將一條Sql語(yǔ)句拆分成多條。在 MyBatis 多表查詢中,使用連接查詢時(shí)一個(gè) Sql 語(yǔ)句就可以查詢出所有的數(shù)據(jù)
    2023-04-04
  • 基于Spring Cloud Zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)

    基于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)題詳解

    這篇文章主要介紹了解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問(wèn)題詳解,需要的朋友可以參考下
    2020-02-02
  • SpringBoot整合log4j2日志的實(shí)現(xiàn)

    SpringBoot整合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

最新評(píng)論