JAVA中的枚舉小結

枚舉

將一組有限集合建立爲一種新的類型,集合裏面的值能夠做爲程序組件使用;java

枚舉基本特性

如下代碼是枚舉的簡單使用:編程

使用values方法返回enum實例的數組數組

使用ordinal方法返回每一個enum實例的次序,從0開始ide

使用compareTo方法比較兩個enum實例this

使用==來比較enum實例spa

使用getDeclaringClass方法返回enum實例所屬的enum類code

使用valueOf方法根據指定的名字返回enum實例blog

package enumerated;

enum Shrubbery {
    GROUND, CRAWLING, HANGING
}

public class EnumClass {
    public static void main(String[] args) {
        for (Shrubbery s : Shrubbery.values()) {
            System.out.println(s + " ordinal: " + s.ordinal());
            System.out.println(s.compareTo(Shrubbery.CRAWLING) + " ");
            System.out.println(s.equals(Shrubbery.CRAWLING) + " ");
            System.out.println(s == Shrubbery.CRAWLING);
            System.out.println(s.getDeclaringClass());
            System.out.println(s.name());
            System.out.println("----------------------");
        }
        // Produce an enum value from a string name:
        for (String s : "HANGING CRAWLING GROUND".split(" ")) {
            Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
            System.out.println(shrub);
        }
    }
}

注意枚舉enum默認是繼承自java.lang.Enum類的,在以上代碼中,Shrubber爲一個枚舉類, GROUND, CRAWLING, HANGING爲這個enum類的實例,因爲Shrubber已經繼承自java.lang.Enum類,因此它是不能在繼承其它enum類的繼承

另外,在使用枚舉的時候,能夠考慮使用靜態導入枚舉類型,省去使用枚舉類型修飾枚舉實例;ip

向enum中添加方法

enum基本上是能夠被看作一個常規的類,能夠向其添加方法,甚至main方法;

以下代碼,在枚舉類內部添加一個構造方法和getDescription方法, 注意,當定義本身方法的時候,須要在enum實例序列的最後一個後面添加分號,且要先定義enum實例再定義方法;

package enumerated;

public enum OzWitch {
    // Instances must be defined first, before methods:
    WEST("Miss Gulch, aka the Wicked Witch of the West"), 
    NORTH("Glinda, the Good Witch of the North"), 
    EAST("Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house"), 
    SOUTH("Good by inference, but missing");
    private String description;

    // Constructor must be package or private access:
    private OzWitch(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public static void main(String[] args) {
        for (OzWitch witch : OzWitch.values())
            System.out.println(witch + ": " + witch.getDescription());
    }
}

再看一個例子,覆蓋Enum類的方法,以下代碼,覆蓋toString方法,將枚舉的name首字母大寫,其他轉爲小寫,:

package enumerated;

public enum SpaceShip {
    SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP;
    public String toString() {
        String id = name();
        String lower = id.substring(1).toLowerCase();
        return id.charAt(0) + lower;
    }

    public static void main(String[] args) {
        for (SpaceShip s : values()) {
            System.out.println(s);
        }
    }
}

在switch中使用枚舉

以下代碼是枚舉在switch語句中的使用,注意在case語句裏,枚舉實例前面是不須要寫上枚舉類型的,強行寫上(如Signal.RED)編譯器會報錯;

package enumerated;

// Define an enum type:
enum Signal {
    GREEN, YELLOW, RED,
}

public class TrafficLight {
    Signal color = Signal.RED;

    public void change() {
        switch (color) {
        // Note that you don't have to say Signal.RED
        // in the case statement:
        case RED:
            color = Signal.GREEN;
            break;
        case GREEN:
            color = Signal.YELLOW;
            break;
        case YELLOW:
            color = Signal.RED;
            break;
        }
    }

    public String toString() {
        return "The traffic light is " + color;
    }

    public static void main(String[] args) {
        TrafficLight t = new TrafficLight();
        for (int i = 0; i < 7; i++) {
            System.out.println(t);
            t.change();
        }
    }
}

關於枚舉中的values()方法

咱們已經知道枚舉類是繼承java.lang.Enum類的,可是查看Enum源代碼卻沒有發現有values()方法,那麼values()方法是哪裏來的呢?

答案是,values()方法是由編譯器添加的靜態方法,有興趣能夠利用反射機制去查看,如上面的例子,能夠編寫以下代碼查看:

Method[] methods = Signal.class.getMethods();

 其它補充

看一個例子就好,以下:

基本能夠把枚舉當成一個類來使用;

//Color繼承自Enum
public enum Color {

    //Color實例
    RED("Red"), 
    YELLOW("Yellow"), 
    //Color實例,繼承自Color
    BLUE("Blue") {
        @Override
        public String getDescription() {
            //調用父類的test方法,BLUE實例是繼承自Color的
            super.test();
            return super.getDescription();
        }
        //重寫父類Color的toString方法
        @Override
        public String toString() {
            return "藍色";
        }
    };
    
    private String description;

    private Color(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
    
    //重寫父類Enum的toString方法
    @Override
    public String toString() {
        return this.description;
    }

    public void test() {
        System.out.println("hi~");
    }

    public static void main(String[] args) {
        //調用Color.BLUE實例的getDescription方法
        Color.BLUE.getDescription();
        
        //Color.RED是Color的一個實例,Color繼承自Enum
        Enum<Color> red = Color.RED;
        System.out.println(red);//調用Color的toString
        
        //調用Color.BLUE的toString
        System.out.println(Color.BLUE);

    }
}

 

參考資料:JAVA編程思想--4

相關文章
相關標籤/搜索