Java修炼之路——基础篇——枚举
枚舉的用法
每個(gè)枚舉變量其實(shí)都是枚舉類的一個(gè)實(shí)例。
枚舉與單例
各種模式的單例模式,包括枚舉實(shí)現(xiàn)的單例
枚舉如何比較
可以用equals(),也可以用==,推薦使用==
enum的equals()方法實(shí)現(xiàn)如下:
可以看出,也是調(diào)用的==實(shí)現(xiàn)的。
官方文檔說明如下:
另外,==和equals()的不同如下:
== 不會(huì)拋出 NullPointerException enum Color { BLACK, WHITE };Color nothing = null; if (nothing == Color.BLACK); // runs fine if (nothing.equals(Color.BLACK)); // throws NullPointerException== 在編譯期檢測類型兼容性 enum Color { BLACK, WHITE }; enum Chiral { LEFT, RIGHT };if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!總而言之,在枚舉比較上使用 == , 因?yàn)?#xff1a; 1. 能正常工作 2. 更快 3. 編譯期是安全的 4. 運(yùn)行時(shí)也是安全的
switch 對(duì)枚舉的支持
枚舉 switchcase 標(biāo)簽必須為枚舉常量的非限定名稱
用法如下:
枚舉的線程安全性問題
枚舉的序列化如何實(shí)現(xiàn)
枚舉是線程安全的,描述如下:
1:枚舉的實(shí)現(xiàn)方式
//定義枚舉 public enum t {SPRING,SUMMER,AUTUMN,WINTER; } //反編譯枚舉類 public final class T extends Enum {private T(String s, int i){super(s, i);}public static T[] values(){T at[];int i;T at1[];System.arraycopy(at = ENUM$VALUES, 0, at1 = new T[i = at.length], 0, i);return at1;}public static T valueOf(String s){return (T)Enum.valueOf(demo/T, s);}public static final T SPRING;public static final T SUMMER;public static final T AUTUMN;public static final T WINTER;private static final T ENUM$VALUES[];static{SPRING = new T("SPRING", 0);SUMMER = new T("SUMMER", 1);AUTUMN = new T("AUTUMN", 2);WINTER = new T("WINTER", 3);ENUM$VALUES = (new T[] {SPRING, SUMMER, AUTUMN, WINTER});} }通過反編譯后代碼我們可以看到,public final class T extends Enum,說明,該類是繼承了Enum類的,同時(shí)final關(guān)鍵字告訴我們,這個(gè)類也是不能被繼承的。
并且方法與屬性都是static的,而static類型的屬性會(huì)在類被加載之后被初始化。當(dāng)一個(gè)Java類第一次被真正使用到的時(shí)候靜態(tài)資源被初始化、Java類的加載和初始化過程都是線程安全的。所以,創(chuàng)建一個(gè)enum類型是線程安全的。
2:枚舉的序列化
JavaDoc中的描述:
我們看一下這個(gè)valueOf方法:
public static <T extends Enum<T>>T valueOf(Class<T> enumType,String name) { T result = enumType.enumConstantDirectory().get(name); if (result != null) return result; if (name == null) throw new NullPointerException("Name is null"); throw new IllegalArgumentException( "No enum const " + enumType +"." + name); }從代碼中可以看到,代碼會(huì)嘗試從調(diào)用enumType這個(gè)Class對(duì)象的enumConstantDirectory()方法返回的map中獲取名字為name的枚舉對(duì)象,如果不存在就會(huì)拋出異常。再進(jìn)一步跟到enumConstantDirectory()方法,就會(huì)發(fā)現(xiàn)到最后會(huì)以反射的方式調(diào)用enumType這個(gè)類型的values()靜態(tài)方法,也就是上面我們看到的編譯器為我們創(chuàng)建的那個(gè)方法,然后用返回結(jié)果填充enumType這個(gè)Class對(duì)象中的enumConstantDirectory屬性。
所以,JVM對(duì)序列化有保證。
此段描述來自于:http://blog.jobbole.com/94074/
總結(jié)
以上是生活随笔為你收集整理的Java修炼之路——基础篇——枚举的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当归枸杞红枣泡酒的功效与作用、禁忌和食用
- 下一篇: 2019-03-4-算法-进化(罗马数字