一、enum關鍵字
enum關鍵字是在Java1.5也就是Java SE5之后引入的一個新特性:它通過關鍵字enum來定義一個列舉類,這個被定義的列舉類繼承Enum類,這個列舉類算是一種特殊類,它同樣能像其他普通類一樣擁有構造器、方法,也能夠實作介面,但是它不能再繼承其他別的類,因為它的直接父類是Enum類,并且因為它默認的修飾符有final的存在,因此它無法直接派生出其他子類,除非將其使用abstract修飾,
按照《Java編程思想》中的原話來說:關鍵字enum可以將一組具名的值的有限集合創建為一種新的型別,而這些具名的值可以作為常規的程式組件來使用,
在列舉類出現之前Java是將常量放在介面或是放在普通類當中,然后使用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; }
在列舉型別出現之后,就可以使用列舉型別來定義常量,這些列舉型別成員_1、_2、_3都默認被public、static、final修飾,語法如下:
public enum Constants { CONSTANT_1, CONSTANT_2, CONSTANT_3 }
但是Java列舉型別輸出其常量的時候不像C /C++的列舉那樣是數字,輸出的是其常量名,如果需要輸出其型別成員宣告時數字次序的話,需要呼叫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()); } } 輸出結果: SHERLOCK WASTON 0 1
二、列舉單例的實作
單例模式的特點有以下三個:
- 1、單例類只能有一個實體,
- 2、單例類必須自己創建自己的唯一實體,
- 3、單例類必須給所有其他物件提供這一實體,
我們可以發現列舉型別十分契合以上三個特點,并且我們通過創建列舉型別,可以發現它其中每一個型別成員其實都是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()); } } 輸出結果: true true class com.sherlock.singleton.Singleton2
利用這個特性,我們就可以通過如下代碼創建單例,同時又因為這個特性,決定了它只能屬于餓漢式單例模式
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(); } }
輸出結果如下:
class com.sherlock.singleton.Singleton2 I am Sherlock!
三、列舉單例的優缺點
優點:
(1)能夠避免多執行緒同步問題;
(2)能夠防止反序列化重新創建物件;
(3)實作比起其它懶漢式、餓漢式單例來說十分簡潔,閱讀性好;
缺點:
(1)因為是餓漢式加載,所以會導致列舉實體會長期存在于記憶體當中;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/12578.html
標籤:設計模式
上一篇:代理模式
下一篇:23種 設計模式 簡介
