程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 【JAVA基礎】枚舉,java枚舉

【JAVA基礎】枚舉,java枚舉

編輯:JAVA綜合教程

【JAVA基礎】枚舉,java枚舉


枚舉

將一組有限集合創建為一種新的類型,集合裡面的值可以作為程序組件使用;

枚舉基本特性

以下代碼是枚舉的簡單使用:

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

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

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

使用==來比較enum實例

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

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

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類;

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

向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();

 

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved