(Java)Enum

一、基本概念

已經知道使用 eunm 關鍵字可以定義一個枚舉,該關鍵字表示的是 java.lang.Enum類型,即使用 enum 聲明的枚舉類型就相當於定義一個類,此類默認繼承 java.lang.Enum 類。
java.lang.Enum 的定義:

public abstract  class Enum<E extends Enum<E>> extends Object
implements Comparable<E>,java.io.Serializable

從定義可看出該類實現了 Comparable 和 Serializable 接口,證明枚舉可以使用比較器和序列化操作

枚舉類的主要操作方法:
在這裏插入圖片描述

二、取得枚舉的信息

在枚舉類建立完成後,實際上都會爲其調用枚舉類中的構造方法,爲其賦值。在 Enum 類的構造方法中的第一個參數 name 就是定義的枚舉的名稱,第二個參數 ordinal 則會從 0 開始依次進行編號,之後可以使用 Enum 類總提供的 name()ordinal() 方法取得名稱和編號

enum Color{
    RED,GREEN,BLUE;//定義枚舉的3個類型
}
public class Test{
    public static void main(String[] args) {
        for (Color c:Color.values()){//枚舉.values() 表示得到全部枚舉的內容
            System.out.println(c.ordinal() + "-->" + c.name());
        }
    }
}

在這裏插入圖片描述

三、爲每一個枚舉對象屬性賦值

1. 通過構造方法爲屬性賦值

每個枚舉類中都有其指定好的若干對象,當然每一個枚舉對象中也可以包含多個屬性,這些屬性可以通過構造方法爲其賦值

enum Color{
    RED("紅色"),GREEN("綠色"),BLUE("藍色");//定義枚舉的3個類型
    private Color(String name){
        this.setName(name);
    }
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
public class Test{
    public static void main(String[] args) {
        for (Color c:Color.values()){//枚舉.values() 表示得到全部枚舉的內容
            System.out.println(c.ordinal() + "-->" + c.name() + c.getName());
        }
    }
}

程序中在定義的 Color 枚舉類中設置了一個 name屬性,並且通過構造方法設置 name 屬性的內容。因爲 Color 中已經明確地寫出了有一個參數的構造方法,所以在聲明枚舉內容時必須調用這個構造方法,這樣在定義枚舉內容時必須使用如下的語句形式:

RED("紅色"),GREEN("綠色"),BLUE("藍色");

2. 通過 setter方法爲屬性賦值

也可以通過調用 setter() 方式爲指定的屬性賦值,但是這樣必須明確每一個枚舉類的對象,如果操作的對象時 RED,則名字應該爲“紅色”;如果操作的對象是GREEN,則名字應該爲“綠色”等。

enum Color{
    RED,GREEN,BLUE;//定義枚舉的3個類型
    private String name;
    public String getName(){
        return name;
    }

    public void setName(String name) {
        switch (this){
            case RED:{
                if ("紅色".equals(name)){
                    this.name = name;
                }else System.out.println("設置內容錯誤。");
                break;
            }
            case GREEN:{
                if ("綠色".equals(name)){
                    this.name = name;
                }else System.out.println("設置內容錯誤。");
                break;
            }
            case BLUE:{
                if ("藍色".equals(name)){
                    this.name = name;
                }else System.out.println("設置內容錯誤。");
                break;
            }
        }
    }
}
public class Root{
    public static void main(String[] args) {
        Color c = Color.BLUE;
        c.setName("蘭色");//設置一個錯誤的名字
        c.setName("藍色");//設置一個正確的名字
        System.out.println(c.getName());
    }
}

在這裏插入圖片描述
代碼中首先通過枚舉類取得了裏面的一個對象,之後開始爲期設置內容。

四、使用比較器

在 Enum 類的定義中已經實現好了 Comparable 接口,所以枚舉類的內容本身是可以進行排序的,可以通過 TreeSet 進行枚舉的排序操作

enum Color {
    RED, GREEN, BLUE;//定義枚舉的3個類型
}

public class Root{
    public static void main(String[] args) {
        Set<Color> t = new TreeSet<Color>();//只能加入 Color 類型
        t.add(Color.GREEN);
        t.add(Color.BLUE);
        t.add(Color.RED);
        Iterator<Color> iter = t.iterator();//使用迭代輸出
        while (iter.hasNext()) {
            System.out.print(iter.next() + "、");
        }
    }
}

在這裏插入圖片描述
這裏加入的順序和輸出的信息不一致,證明已經被排序了,是使用Enum 類中的 ordinal 屬性排序的

發佈了587 篇原創文章 · 獲贊 267 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章