1. 程式人生 > >列舉實現單例模式分析理解

列舉實現單例模式分析理解

寫法:

enum EnumSingleton{
    INSTANCE;
    public void doSomeThing(){
    }
}
Java中的列舉和其它語言不同,它是一個物件。早期的 Java 是沒有列舉型別的大家都用類似於單例的方式來實現列舉,簡單的說就是讓構造 private 化,在 static 塊中產生多個 final 的物件例項,通過比較引用(或 equals)來進行比較

早期用類的方式實現的列舉

public class MyEnum {
    public static MyEnum NumberZero;
    public static MyEnum NumberOne;
    public
static MyEnum NumberTwo; public static MyEnum NumberThree; static { NumberZero = new MyEnum(0); NumberOne = new MyEnum(1); NumberTwo = new MyEnum(2); NumberThree = new MyEnum(3); } private final int value; private MyEnum(int value) { this
.value = value; } public int getValue() { return value; } }

Java5 的列舉

從 Java 5 開始有列舉型別之後,類似的實現可以這樣

類似類方式實現的列舉實現

public enum MyEnum {
    NumberZero(0),
    NumberOne(1),
    NumberTwo(2),
    NumberThree(3);

    private final int value;

    MyEnum(int value) {
        this.value = value;
    }

    public
int getValue()
{ return value; } }

其實仔細比較會發現,就是簡化了定義過程,構造方法簡不能使用 public 或 protected 修飾符,如果省略也不是package,而是 private;另外 final static 屬性定義簡化了,static 塊也簡化掉了。

當然,像這種值從 0 開始的,可以更簡單的實現,getValue() 直接返回其順序號就行。

更簡單的實現方式(題外話)

public enum MyEnum {
    NumberZero,
    NumberOne,
    NumberTwo,
    NumberThree;

    public int getValue() {
        return ordinal();
    }
}

回頭說說列舉變單例

上面說了,早期就是通過類似單例模式的方式來實現的列舉。而後的列舉例項也和類方式實現極為相似,那麼,如果列舉值只有 1 個的時候,其例項也就只有 1 個,就完全符合了單例模式的限定。由於 Java 的 enum 可以跟類一樣任意定義方法和屬性,所以就完全可以用列舉來實現單例。這是其它語言如 C++、C# 做不到的。

第一個列舉單例,你要先理解enum, 在你的程式碼中INSTANCE本身就是一個EnumSingleton型別的引用, 與普通的餓漢式單例相似。

雙重校驗鎖的方式
class LockSingleton{
    private volatile static LockSingleton singleton;
    private LockSingleton(){}
     
    //詳見:http://www.ibm.com/developerworks/cn/java/j-dcl.html
    public static LockSingleton getInstance(){
        if(singleton==null){
            synchronized(LockSingleton.class){
                if(singleton==null){
                    singleton=new LockSingleton();
                }
            }
        }
        return singleton;
    }
}
雙層校驗, 第一次校驗不是執行緒安全的,也就是說可能有多個執行緒同時得到singleton為null的結果,接下來的同步程式碼塊保證了同一時間只有一個執行緒進入,而第一個進入的執行緒會建立物件,等其他執行緒再進入時物件已建立就不會繼續建立。這是一個很巧妙的方式,如果對整個方法同步,所有獲取單例的執行緒都要排隊,但實際上只需要對建立過程同步來保證"單例",多個執行緒不管是否已經有單例可以同時去請求。

相關推薦

列舉實現模式分析理解

寫法: enum EnumSingleton{ INSTANCE; public void doSomeThing(){ } } Java中的列舉和其它語言不同,它是一個物件。早期的 Java 是沒有列舉型別的大家都用類似於單例的方式來實現列舉,簡

Effective Java 第二版 中文版 筆記(三)列舉實現模式

 列舉實現單例模式: public enum DataSourceEnum { DATASOURCE; private DBConnection connection = null; private DataSourceEnum() {

Java 利用列舉實現模式

引言 單例模式比較常見的實現方法有懶漢模式,DCL模式公有靜態成員等,從Java 1.5版本起,單元素列舉實現單例模式成為最佳的方法。 Java列舉 基本用法 列舉的用法比較多,本文主要旨在介紹利用列舉實現單例模式的原理,所以這裡也主要介紹一

Java中列舉實現模式

public enum Singleton { INSTANCE; private SingletonClass instance; Singleton() { this.instance = new Singleto

通過列舉實現模式

實現單例的核心在於private私有化類中的構造方法,在列舉中的構造方法必須是私有的,當一個列舉類中只有一個列舉時只會呼叫一次列舉的構造方法,這就為列舉來實現單例奠定了基礎。下面以資料來源中獲得Connection連線來舉例:       在開發中經常是通過資料來源來

列舉建立模式和懶漢式加鎖模式分析與比較

列舉建立單例的模式的優勢比較:方式優點缺點餓漢式執行緒安全, 呼叫效率高不能延遲載入懶漢式執行緒安全, 可以延遲載入呼叫效率不高雙重檢測鎖執行緒安全, 呼叫效率高, 可以延遲載入-靜態內部類執行緒安全, 呼叫效率高, 可以延遲載入-列舉執行緒安全, 呼叫效率高不能延遲載入列舉

java中用列舉實現模式

列舉單例(Enum Singleton)是實現單例模式的一種新方式,儘管單例模式在java中已經存在很長時間了,但是列舉單例相對來說是一種比較新的概念,列舉這個特性是在Java5才出現的,這篇文章主要講解關於為什麼我們應該使用列舉來實現單例模式,它與傳統方式實現的單例模式

淺談使用元素的列舉型別實現模式

簡介 通常情況下,我們寫單例模式的時候無非就是三個步驟:構造器私有化,宣告私有靜態變數,提供靜態獲取例項的方法。簡單說就是以下這種方式: class SingletonA { private static SingletonA inst

Java實現模式之餓漢式、懶漢式、列舉式,帶測試。

Java實現單例的3種普遍的模式,餓漢式、懶漢式、列舉式。 具體程式碼如下: package com.lcx.mode; /** * * 餓漢式單例,不管以後用不用這個物件,我們一開始就建立這個物件的例項, * 需要的時候就返回已建立好的例項物件,所以比較飢餓,

為什麼用列舉類來實現模式越來越流行?

前言 單例模式是 Java 設計模式中最簡單的一種,只需要一個類就能實現單例模式,但是,你可不能小看單例模式,雖然從設計上來說它比較簡單,但是在實現當中你會遇到非常多的坑,所以,繫好安全帶,上車。 單例模式的定義 單例模式就是在程式執行中只例項化一次,建立一個全域性唯一物件,有點像 Java 的靜態變數,但是

溫故而知新(java實現)模式的七種寫法

反序 防止 代碼 工作 html 我想 變種 evel 才會 第一種(懶漢,線程不安全): Java代碼 public class Singleton { private static Singleton instance; private S

Java枚舉enum以及應用:枚舉實現模式

tee configure adr 自由 這樣的 pre 單例模式 做到 build 枚舉作為一個常規的語言概念,一直到Java5才誕生不得不說有點奇怪,以至於到現在為止很多程序員仍然更喜歡用static final的形式去命名常量而不使用,一般情況下,Java程序員用這種

Python 實現模式

python 單例模式 Python 實現單例模式 # 使用Python實現單例模式 # 方法一: 使用__new__方法 class SingleTon(object): def __new__(cls, *args, **kwargs): if not ha

使用靜態代碼塊來實現模式

對象 代碼 over 說明 override out min .get admin package com.wz.thread.staticlump;/** * 使用靜態代碼塊來實現單例模式 * @author Administrator * */public class

枚舉實現模式

min () bject oca serve oid ros manager [] package com.wz.thread.enums;import java.sql.Connection;import java.sql.DriverManager;/** * 使用枚舉

python實現模式

一次 color 中大 我們 浪費 python實現 判斷 內存 () 有這麽一種場景,我們把數據封裝到類體或類的某個方法裏,然而我們new出這個類只是為了拿到這部分數據,那麽當多次這樣調用的時候,每次都來拿數據並放到內存中大大浪費了內存。 那我們就可以想,我們拿到一次數據

python3實現模式

單例模式 python3 單例模式指確保某個類在整個系統中只存在一個實例的一種設計模式使用單例模式的好處:1、每個實例都會占用一定的內存資源,且初始化實例時會影響運行性能,所以當整個系統只需一個實例時,使用單例模式不僅可減少資源占用,而且因為只初始化一次,還可以加快運行性能。例如當程序通過一個類來讀取

python中對模式理解

name none 實例 pan 理解 proc span pytho 相等 class Foo(object): instance = None def __init__(self): pass def process(self

雙重檢查鎖實現模式的線程安全問題

多線程 urn blog 內存 http 代碼 地方 gets 技術博客 一、結論 雙重校驗鎖的單例模式代碼如下: public class Singleton {   private static Singleton singleton;   private Singl

模式理解

pri 代碼 餓漢 image 單例 alt inf 構造 模式 單例模式的要求: 1)單例類的構造函數必須為私有private; 2)提供一個全局訪問點。 上圖中的代碼是餓漢式單例模式,自行實例化。 單例模式是指一個類只有一個實例,且自行實例化,並向整個系統提供這個實例