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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

枚舉

2019-11-14 10:13:21
字體:
供稿:網(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() 一定返回枚舉定義時的名稱,toString 默認(rèn)情況下與 name() 相同,但是在子類中 toString 可以覆蓋,而 name() 是 final 的。枚舉的實現(xiàn)是單例的,但是還是使用 equals 養(yǎng)成良好習(xí)慣。

神奇的 enum

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

enum 的多態(tài)

Java 允許為 enum 實例編寫方法,可以為 enum 定義一個或多個 abstract 方法,然后為每個 enum 實例實現(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 實例中覆蓋 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 是為了通過 enum 創(chuàng)建一種替代品,以替代傳統(tǒng)的基于 int 的 “位標(biāo)志”,可以用來表示一些開關(guān)信息EnumSet 設(shè)計時充分考慮的性能,內(nèi)部將一個 long 值作為比特向量,并且具有很好的表達(dá)能力。如果 enum 實例的數(shù)量超過了 64(long 的長度)個,會再增加一個 long 。

EnumMap

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 锡林浩特市| 砚山县| 明光市| 沾化县| 高平市| 洛隆县| 浦城县| 巍山| 太原市| 合川市| 锦屏县| 忻城县| 乌什县| 从江县| 苏州市| 房产| 红河县| 亚东县| 孟州市| 富锦市| 自贡市| 错那县| 乃东县| 高陵县| 博湖县| 陇西县| 怀柔区| 印江| 米泉市| 万山特区| 二连浩特市| 巴青县| 承德县| 葵青区| 乐东| 东莞市| 舟曲县| 三都| 横山县| 临澧县| 衡南县|