一、enum關(guān)鍵字enum關(guān)鍵字是在Java1.5也就是Java SE5之后引入的一個(gè)新特性:它通過關(guān)鍵字enum來定義一個(gè)枚舉類,這個(gè)被定義的枚舉類繼承Enum類,這個(gè)枚舉類算是一種特殊類,它同樣能像其他普通類一樣擁有構(gòu)造器、方法,也能夠?qū)崿F(xiàn)接口,但是它不能再繼承其他別的類,因?yàn)樗闹苯痈割愂荅num類,并且因?yàn)樗J(rèn)的修飾符有final的存在,因此它無法直接派生出其他子類,除非將其使用abstract修飾。
在枚舉類出現(xiàn)之前Java是將常量放在接口或是放在普通類當(dāng)中,然后使用public、static、final去修飾定義的常量,如下兩個(gè)例子: 在枚舉類型出現(xiàn)之后,就可以使用枚舉類型來定義常量,這些枚舉類型成員_1、_2、_3都默認(rèn)被public、static、final修飾,語法如下: 但是Java枚舉類型輸出其常量的時(shí)候不像C /C++的枚舉那樣是數(shù)字,輸出的是其常量名,如果需要輸出其類型成員聲明時(shí)數(shù)字次序的話,需要調(diào)用ordinal()方法: 二、枚舉單例的實(shí)現(xiàn)單例模式的特點(diǎn)有以下三個(gè):
我們可以發(fā)現(xiàn)枚舉類型十分契合以上三個(gè)特點(diǎn),并且我們通過創(chuàng)建枚舉類型,可以發(fā)現(xiàn)它其中每一個(gè)類型成員其實(shí)都是Singleton2這個(gè)枚舉類的一個(gè)實(shí)例。 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 利用這個(gè)特性,我們就可以通過如下代碼創(chuàng)建單例,同時(shí)又因?yàn)檫@個(gè)特性,決定了它只能屬于餓漢式單例模式 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é)果如下: 三、枚舉單例的優(yōu)缺點(diǎn)優(yōu)點(diǎn): (1)能夠避免多線程同步問題; (2)能夠防止反序列化重新創(chuàng)建對象; (3)實(shí)現(xiàn)比起其它懶漢式、餓漢式單例來說十分簡潔,閱讀性好; 缺點(diǎn): (1)因?yàn)槭丘I漢式加載,所以會(huì)導(dǎo)致枚舉實(shí)例會(huì)長期存在于內(nèi)存當(dāng)中; |
|