国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

枚舉

2019-11-14 10:08:54
字體:
來源:轉載
供稿:網友

enum 的特征

public enum ColorEnum { RED("紅色"), BLUE("藍色"), GREEN("綠色"), ; PRivate String description; private static Random random = new Random(4l); ColorEnum(String description){ this.description = description; } public String getDescription() { return description; } @Override public String toString(){ return "enum:" + this.name(); } public static ColorEnum next(){ return values()[random.nextInt(values().length)]; } public static void main(String[] args){ // 1.values() for(ColorEnum colorEnum : ColorEnum.values()) { // 2.name() 與 toString() System.out.print(colorEnum.name() + " "); System.out.print(colorEnum + " "); System.out.print(colorEnum.getDescription() + " "); // 3.ordinal() System.out.println(colorEnum.ordinal()); } ColorEnum colorEnum = ColorEnum.next(); // 4.valueOf() ColorEnum colorEnum1 = ColorEnum.valueOf(colorEnum.name()); // 5.單例,equals 和 == 結果相同 System.out.println(colorEnum == colorEnum1); System.out.println(colorEnum.equals(colorEnum1)); // 6.getDeclaringClass() System.out.println(colorEnum.getDeclaringClass()); // 7.compareTo() 聲明順序比較 System.out.println(colorEnum.compareTo(RED)); System.out.println(colorEnum.compareTo(BLUE)); System.out.println(colorEnum.compareTo(GREEN)); // 8.getEnumConstants() ColorEnum[] values = ColorEnum.class.getEnumConstants(); }}name() 一定返回枚舉定義時的名稱,toString 默認情況下與 name() 相同,但是在子類中 toString 可以覆蓋,而 name() 是 final 的。枚舉的實現是單例的,但是還是使用 equals 養成良好習慣。

神奇的 enum

將上一個例子編譯后的 .class 文件進行反編譯后,會看到一些有趣的問題:

Compiled from "ColorEnum.java"public final class lirui.ColorEnum extends java.lang.Enum<lirui.ColorEnum> { public static final lirui.ColorEnum RED; public static final lirui.ColorEnum BLUE; public static final lirui.ColorEnum GREEN; public static lirui.ColorEnum[] values(); public static lirui.ColorEnum valueOf(java.lang.String); public java.lang.String getDescription(); public static lirui.ColorEnum next(); public java.lang.String toString(); public static void main(java.lang.String[]); static {};}編譯器為類聲明添加了 final,并且繼承了 Enum 類,所以編寫枚舉類時不能在繼承其他類,但是可以實現接口。編譯器添加了 static final 的枚舉對象,這也是我們平時可以使用 ColorEnum.RED 獲取枚舉實例的原因。所以枚舉實現是單例的。編譯器添加了 values(),valueOf() 這兩個方法,而對于他的父類 Enum 也有一個valueOf(),不過兩者參數不同,并不是同一個方法。將 ColorEnum 向上轉型為 Enum 時,values() 方法將失效,但是可以使用 Class 上的 getEnumConstants() 獲取所有 enum 實例。

enum 的多態

Java 允許為 enum 實例編寫方法,可以為 enum 定義一個或多個 abstract 方法,然后為每個 enum 實例實現該抽象方法。public enum ColorEnum{ RED("紅色"){ public String getName(){ return "紅色"; } }, BLUE("藍色"){ public String getName(){ return "藍色"; } }, GREEN("綠色") { String getName() { return "綠色"; } }, ; private String description; private static Random random = new Random(4); abstract String getName(); ColorEnum(String description){ this.description = description; } public String getDescription() { return description; } @Override public String toString(){ return "enum:" + this.name(); } public static ColorEnum next(){ return values()[random.nextInt(values().length)]; } public static void main(String[] args){ for(ColorEnum colorEnum : ColorEnum.values()) { System.out.println(colorEnum.getName()); } }}還可以在enum 實例中覆蓋 enum 定義的方法。public enum ColorEnum{ RED("紅色"){ public String getName(){ return "紅色"; } }, BLUE("藍色"){ public String getName(){ return "藍色"; } }, GREEN("綠色") { public String getName() { return "綠色"; } }, ; private String description; private static Random random = new Random(4); public String getName(){ return "顏色"; } ColorEnum(String description){ this.description = description; } public String getDescription() { return description; } @Override public String toString(){ return "enum:" + this.name(); } public static ColorEnum next(){ return values()[random.nextInt(values().length)]; } public static void main(String[] args){ for(ColorEnum colorEnum : ColorEnum.values()) { System.out.println(colorEnum.getName()); } }}

switch 中使用 enum

public static String getName(ColorEnum colorEnum){ switch (colorEnum){ case RED: return "紅色"; case BLUE: return "藍色"; case GREEN: return "綠色"; default: return null; } }

EnumSet

EnumSet 是為了通過 enum 創建一種替代品,以替代傳統的基于 int 的 “位標志”,可以用來表示一些開關信息EnumSet 設計時充分考慮的性能,內部將一個 long 值作為比特向量,并且具有很好的表達能力。如果 enum 實例的數量超過了 64(long 的長度)個,會再增加一個 long 。

EnumMap

EnumMap 是一個特殊的 map, 他要求其中的鍵必須來自一個 enum。由于 enum 的數量有限,所以 Enum 內部可以使用數組實現,所以它的速度也非常快。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平南县| 阳信县| 九寨沟县| 平阳县| 紫阳县| 宣威市| 靖州| 张北县| 太白县| 博野县| 乌鲁木齐市| 兴文县| 金堂县| 株洲市| 诏安县| 麟游县| 保康县| 邵武市| 林周县| 来凤县| 金阳县| 青浦区| 遂溪县| 大安市| 清水河县| 明水县| 辉县市| 石狮市| 温州市| 濉溪县| 静海县| 陵水| 台前县| 昌都县| 徐汇区| 从化市| 延安市| 从化市| 阿城市| 徐汇区| 志丹县|