1. 程式人生 > >java中的枚舉類

java中的枚舉類

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中的枚舉類