亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

    Spring入門實戰(zhàn)之Profile詳解

    什么是spring profile?簡單講profile就是一組配置,不同profile提供不同組合的配置,程序運行時可以選擇使用哪些profile來適應(yīng)環(huán)境。下面這篇文章主要介紹了Spring中Profile實戰(zhàn)的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-02-02
  • Java?MapStruct優(yōu)雅地實現(xiàn)對象轉(zhuǎn)換

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

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

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

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

    JAVA區(qū)間值判斷[10,20)的實現(xiàn)

    本文主要介紹了JAVA區(qū)間值判斷[10,20)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 淺談Spring中HandlerMapping的使用

    淺談Spring中HandlerMapping的使用

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

    Mybatis分解式查詢使用方法

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

    基于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后報錯問題詳解

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

    SpringBoot整合log4j2日志的實現(xiàn)

    在項目推進中,如果說第一件事是搭Spring框架的話,那么第二件事情就是在Sring基礎(chǔ)上搭建日志框架,大家都知道日志對于一個項目的重要性,尤其是線上Web項目,因為日志可能是我們了解應(yīng)用如何執(zhí)行的唯一方式。此篇文章是博主在實踐中用Springboot整合log4j2日志的總結(jié)
    2021-06-06

最新評論