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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

枚舉

2019-11-14 10:01:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

enum 的特征

public enum ColorEnum { RED("紅色"), BLUE("藍(lán)色"), 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 和 == 結(jié)果相同 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() 一定返回枚舉定義時(shí)的名稱,toString 默認(rèn)情況下與 name() 相同,但是在子類中 toString 可以覆蓋,而 name() 是 final 的。枚舉的實(shí)現(xiàn)是單例的,但是還是使用 equals 養(yǎng)成良好習(xí)慣。

神奇的 enum

將上一個(gè)例子編譯后的 .class 文件進(jìn)行反編譯后,會(huì)看到一些有趣的問(wèn)題:

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 類,所以編寫(xiě)枚舉類時(shí)不能在繼承其他類,但是可以實(shí)現(xiàn)接口。編譯器添加了 static final 的枚舉對(duì)象,這也是我們平時(shí)可以使用 ColorEnum.RED 獲取枚舉實(shí)例的原因。所以枚舉實(shí)現(xiàn)是單例的。編譯器添加了 values(),valueOf() 這兩個(gè)方法,而對(duì)于他的父類 Enum 也有一個(gè)valueOf(),不過(guò)兩者參數(shù)不同,并不是同一個(gè)方法。將 ColorEnum 向上轉(zhuǎn)型為 Enum 時(shí),values() 方法將失效,但是可以使用 Class 上的 getEnumConstants() 獲取所有 enum 實(shí)例。

enum 的多態(tài)

Java 允許為 enum 實(shí)例編寫(xiě)方法,可以為 enum 定義一個(gè)或多個(gè) abstract 方法,然后為每個(gè) enum 實(shí)例實(shí)現(xiàn)該抽象方法。public enum ColorEnum{ RED("紅色"){ public String getName(){ return "紅色"; } }, BLUE("藍(lán)色"){ public String getName(){ return "藍(lán)色"; } }, 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 實(shí)例中覆蓋 enum 定義的方法。public enum ColorEnum{ RED("紅色"){ public String getName(){ return "紅色"; } }, BLUE("藍(lán)色"){ public String getName(){ return "藍(lán)色"; } }, 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 "藍(lán)色"; case GREEN: return "綠色"; default: return null; } }

EnumSet

EnumSet 是為了通過(guò) enum 創(chuàng)建一種替代品,以替代傳統(tǒng)的基于 int 的 “位標(biāo)志”,可以用來(lái)表示一些開(kāi)關(guān)信息EnumSet 設(shè)計(jì)時(shí)充分考慮的性能,內(nèi)部將一個(gè) long 值作為比特向量,并且具有很好的表達(dá)能力。如果 enum 實(shí)例的數(shù)量超過(guò)了 64(long 的長(zhǎng)度)個(gè),會(huì)再增加一個(gè) long 。

EnumMap

EnumMap 是一個(gè)特殊的 map, 他要求其中的鍵必須來(lái)自一個(gè) enum。由于 enum 的數(shù)量有限,所以 Enum 內(nèi)部可以使用數(shù)組實(shí)現(xiàn),所以它的速度也非常快。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蕉岭县| 平阳县| 青河县| 峨眉山市| 青河县| 巧家县| 博湖县| 蓝田县| 津市市| 图们市| 杭锦旗| 郁南县| 锦州市| 潮安县| 肥乡县| 淮安市| 武汉市| 彩票| 河北区| 镇江市| 牟定县| 佛坪县| 南丹县| 隆安县| 崇义县| 富锦市| 大名县| 衡阳县| 兰西县| 宜城市| 昌宁县| 抚松县| 拉萨市| 五峰| 新乡县| 永胜县| 桂东县| 原平市| 陈巴尔虎旗| 仙游县| 上虞市|