java中的枚舉類
阿新 • • 發佈:2018-02-01
args add ping 觀察 ros ann 不能 false ide 初識枚舉類,我們也許會提出疑問,枚舉它是一種新的類型嗎?不同於基本數據類型,引用
類型??為了更好地理解,我們從反編譯一個enum類開始:
原java代碼
import java.util.Arrays; import java.util.List; public enum Weather { Sunny(1, "晴天"), Rainy(2, "雨天"), Cloudy(3, "多雲"); private int value; private String label; private Weather(int value, String label) { this.value = value; this.label = label; } public int getValue() { return value; } public String getLabel() { return label; } public static Weather parse(int value) { Weather result = Weather.Sunny; switch (value) { case 1: result = Weather.Sunny; break; case 2: result = Weather.Rainy; break; case 3: result = Weather.Cloudy; break; } return result; } public static List<Weather> getEnumValues() { return Arrays.asList(values()); } public static void main(String[] args) { System.out.println(Weather.Sunny.getValue() + ":" + Weather.Sunny.getLabel()); Weather weather = Weather.Cloudy; System.out.println(weather.getValue() + ":" + weather.getLabel()); List<Weather> list = getEnumValues(); for (Weather sw : list) { System.out.println(sw.value + "--" + sw.label); } } }
反編譯之後:
import java.io.PrintStream; import java.util.*; public final class Weather extends Enum{ private Weather(String s, int i, int value, String label){ super(s, i); this.value = value; this.label = label; } public int getValue(){ return value; } public String getLabel(){ return label; } public static Weather parse(int value){ Weather result = Sunny; switch(value){ case 1: /*// '\001'*/ result = Sunny; break; case 2: /*// '\002'*/ result = Rainy; break; case 3: /*// '\003'*/ result = Cloudy; break; } return result; } public static List getEnumValues(){ return Arrays.asList(values()); } public static void main(String args[]){ System.out.println((new StringBuilder(String.valueOf(Sunny.getValue()))).append(":").append(Sunny.getLabel()).toString()); Weather weather = Cloudy; System.out.println((new StringBuilder(String.valueOf(weather.getValue()))).append(":").append(weather.getLabel()).toString()); List list = getEnumValues(); Weather sw; for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println((new StringBuilder(String.valueOf(sw.value))).append("--").append(sw.label).toString())) sw = (Weather)iterator.next(); } public static Weather[] values(){ Weather aweather[]; int i; Weather aweather1[]; System.arraycopy(aweather = ENUM$VALUES, 0, aweather1 = new Weather[i = aweather.length], 0, i); return aweather1; } public static Weather valueOf(String s){ return (Weather)Enum.valueOf(Weather, s); } public static final Weather Sunny; public static final Weather Rainy; public static final Weather Cloudy; private int value; private String label; private static final Weather ENUM$VALUES[]; static { Sunny = new Weather(/*"Sunny", 0,*/ 1, "\u6674\u5929"); Rainy = new Weather(/*"Rainy", 1,*/ 2, "\u96E8\u5929"); Cloudy = new Weather(/*"Cloudy", 2,*/ 3, "\u591A\u4E91"); ENUM$VALUES = (new Weather[] { Sunny, Rainy, Cloudy }); } }
通過觀察代碼我們會發現enum關鍵字的含義其實就是使類被final修飾並繼承抽象類Enum,它是java枚舉類型的公共基本類,裏面提供了一些
公共方法,同時對象Sunny、Rainy、Cloudy都是使用static final修飾的不可變引用,他們在靜態塊中被用new的方式實例化並初始化。因此
得出結論:實際上枚舉類型就是以Java類來實現的,沒有什麽新的特點,只不過java編譯器幫我們做了語法的解析和編譯。同時反編譯之後,
代碼中還自動生成了兩個方法values()和valueOf(String name),這兩個方法存在於
java.lang.annotation.ElementType
類下面:
valueOf(String name)返回指定枚舉常量
values()返回枚舉類型的數據,用於遍歷枚舉
public enum Test { RED,YELLOW,GREEN,BLACK; public static void main(String[] args) { Test t[] = Test.values(); for (int i = 0; i < t.length; i++) { System.out.println(t[i] + ":" + t[i].ordinal()); } } }
結果:
RED:0 YELLOW:1 GREEN:2 BLACK:3
通過反編譯也可以看出,枚舉類其實就是簡單的java類構成的,不過它已經繼承了Enum類,由於單繼承特性,他不能再繼承
其它類了,但可以實現接口。
以下是一個含有抽象方法的枚舉類:
import java.util.Arrays; import java.util.List; public enum Weather { Sunny(1, "晴天") { @Override public String test() { return "今天陽光明媚!!!\n"; } }, Rainy(2, "雨天") { @Override public String test() { return "出門別忘帶把雨傘哦!!!\n"; } }, Cloudy(3, "多雲") { @Override public String test() { return "別出去登高望遠了,你看不遠的,呵呵呵!!!\n"; } }; private int value; private String label; private Weather(int value, String label) { this.value = value; this.label = label; } public int getValue() { return value; } public String getLabel() { return label; } public abstract String test(); public static Weather parse(int value) { Weather result = Weather.Sunny; switch (value) { case 1: result = Weather.Sunny; break; case 2: result = Weather.Rainy; break; case 3: result = Weather.Cloudy; break; } return result; } public static List<Weather> getEnumValues() { return Arrays.asList(values()); } public static void main(String[] args) { System.out.println(Weather.Sunny.getValue() + ":" + Weather.Sunny.getLabel()); Weather weather = Weather.Cloudy; System.out.println(weather.getValue() + ":" + weather.getLabel() + "\n\n"); List<Weather> list = getEnumValues(); for (Weather sw : list) { System.out.println(sw.value + "--" + sw.label + "--" + sw.test()); } } }
反編譯之後:
import java.io.PrintStream; import java.util.*; public abstract class Weather extends Enum { private Weather(String s, int i, int value, String label) { super(s, i); this.value = value; this.label = label; } public int getValue() { return value; } public String getLabel() { return label; } public abstract String test(); public static Weather parse(int value) { Weather result = Sunny; switch (value) { case 1: // '\001' result = Sunny; break; case 2: // '\002' result = Rainy; break; case 3: // '\003' result = Cloudy; break; } return result; } public static List getEnumValues() { return Arrays.asList(values()); } public static void main(String args[]) { System.out.println((new StringBuilder(String.valueOf(Sunny.getValue()))).append(":").append(Sunny.getLabel()).toString()); Weather weather = Cloudy; System.out.println((new StringBuilder(String.valueOf(weather.getValue()))).append(":").append(weather.getLabel()).append("\n\n").toString()); List list = getEnumValues(); Weather sw; for (Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println((new StringBuilder(String.valueOf(sw.value))).append("--").append(sw.label).append("--").append(sw.test()).toString())) sw = (Weather) iterator.next(); } public static Weather[] values() { Weather aweather[]; int i; Weather aweather1[]; System.arraycopy(aweather = ENUM$VALUES, 0, aweather1 = new Weather[i = aweather.length], 0, i); return aweather1; } public static Weather valueOf(String s) { return (Weather) Enum.valueOf(Weather, s); } Weather(String s, int i, int j, String s1, Weather weather) { this(s, i, j, s1); } public static final Weather Sunny; public static final Weather Rainy; public static final Weather Cloudy; private int value; private String label; private static final Weather ENUM$VALUES[]; static { Sunny = new Weather("Sunny", 0, 1, "\u6674\u5929") { public String test() { return "\u4ECA\u5929\u9633\u5149\u660E\u5A9A\uFF01\uFF01\uFF01\n"; } }; Rainy = new Weather("Rainy", 1, 2, "\u96E8\u5929") { public String test() { return "\u51FA\u95E8\u522B\u5FD8\u5E26\u628A\u96E8\u4F1E\u54E6\uFF01\uFF01\uFF01\n"; } }; Cloudy = new Weather("Cloudy", 2, 3, "\u591A\u4E91") { public String test() { return "\u522B\u51FA\u53BB\u767B\u9AD8\u671B\u8FDC\u4E86\uFF0C\u4F60\u770B\u4E0D\u8FDC\u7684\uFF0C\u5475\u5475\u5475\uFF01\uFF01\uFF01\n"; } }; ENUM$VALUES = (new Weather[] { Sunny, Rainy, Cloudy }); } }
由此可得出:
“不含抽象方法”的class反編譯文件:public final class Weather extends Enum
“含有抽象方法”的class反編譯文件:public abstract class Weather extends Enum
java中的枚舉類