日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【面試題】Java單例設(shè)計模式-餓漢式枚舉(enum)單例

 頭號碼甲 2021-07-19

一、enum關(guān)鍵字

enum關(guān)鍵字是在Java1.5也就是Java SE5之后引入的一個新特性:它通過關(guān)鍵字enum來定義一個枚舉類,這個被定義的枚舉類繼承Enum類,這個枚舉類算是一種特殊類,它同樣能像其他普通類一樣擁有構(gòu)造器、方法,也能夠?qū)崿F(xiàn)接口,但是它不能再繼承其他別的類,因為它的直接父類是Enum類,并且因為它默認(rèn)的修飾符有final的存在,因此它無法直接派生出其他子類,除非將其使用abstract修飾。

按照《Java編程思想》中的原話來說:關(guān)鍵字enum可以將一組具名的值的有限集合創(chuàng)建為一種新的類型,而這些具名的值可以作為常規(guī)的程序組件來使用。

在枚舉類出現(xiàn)之前Java是將常量放在接口或是放在普通類當(dāng)中,然后使用public、static、final去修飾定義的常量,如下兩個例子:

public interface Constants2 {
    public static final int CONSTANT_1 = 1;
    public static final int CONSTANT_2 = 2;
    public static final int CONSTANT_3 = 3;
}


public class Constants {
    public static final int CONSTANT_1 = 1;
    public static final int CONSTANT_2 = 2;
    public static final int CONSTANT_3 = 3;
}

在枚舉類型出現(xiàn)之后,就可以使用枚舉類型來定義常量,這些枚舉類型成員_1、_2、_3都默認(rèn)被public、static、final修飾,語法如下:

public enum Constants {
    CONSTANT_1,
    CONSTANT_2,
    CONSTANT_3
}

但是Java枚舉類型輸出其常量的時候不像C /C++的枚舉那樣是數(shù)字,輸出的是其常量名,如果需要輸出其類型成員聲明時數(shù)字次序的話,需要調(diào)用ordinal()方法:

public enum Singleton2 {
    SHERLOCK,
    WASTON;
}

class Main{
    public static void main(String[] args) {
        System.out.println(Singleton2.SHERLOCK);
        System.out.println(Singleton2.WASTON);
        System.out.println(Singleton2.SHERLOCK.ordinal());
        System.out.println(Singleton2.WASTON.ordinal());
    }
}

輸出結(jié)果:
SHERLOCK
WASTON
0
1

二、枚舉單例的實現(xiàn)

單例模式的特點有以下三個:

  • 1、單例類只能有一個實例。
  • 2、單例類必須自己創(chuàng)建自己的唯一實例。
  • 3、單例類必須給所有其他對象提供這一實例。

我們可以發(fā)現(xiàn)枚舉類型十分契合以上三個特點,并且我們通過創(chuàng)建枚舉類型,可以發(fā)現(xiàn)它其中每一個類型成員其實都是Singleton2這個枚舉類的一個實例。

public enum Singleton2 {
    SHERLOCK
}

class Main{
    public static void main(String[] args) {
        Singleton2 sherlock = Singleton2.SHERLOCK;
        Singleton2 sherlock1 = Singleton2.SHERLOCK;
        System.out.println(sherlock == Singleton2.SHERLOCK);
        System.out.println(sherlock == sherlock1);
        System.out.println(Singleton2.SHERLOCK.getDeclaringClass());
    }
}

輸出結(jié)果:
true
true
class com.sherlock.singleton.Singleton2

利用這個特性,我們就可以通過如下代碼創(chuàng)建單例,同時又因為這個特性,決定了它只能屬于餓漢式單例模式

public enum Singleton2 {
    SHERLOCK;
    public void print() {
        System.out.println("I am Sherlock!");
    }
}

class Main{
    public static void main(String[] args) {
        Singleton2 sherlock = Singleton2.SHERLOCK;
        System.out.println(Singleton2.SHERLOCK.getDeclaringClass());
        sherlock.print();
    }
}

輸出結(jié)果如下: 

class com.sherlock.singleton.Singleton2
I am Sherlock!

三、枚舉單例的優(yōu)缺點

優(yōu)點:

(1)能夠避免多線程同步問題;

(2)能夠防止反序列化重新創(chuàng)建對象;

(3)實現(xiàn)比起其它懶漢式、餓漢式單例來說十分簡潔,閱讀性好;

缺點:

(1)因為是餓漢式加載,所以會導(dǎo)致枚舉實例會長期存在于內(nèi)存當(dāng)中;

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多