java核心技術 卷一 學習筆記(5) --------枚舉

從java1.5開始產生的新特性,通過關鍵字enum來定義枚舉類。枚舉類一般用來表示一組相同類型的值,其中包含有限個命名的值。枚舉類是一種特殊的類,它也可以有自己的成員變量、方法,可以實現一個或者多個接口,還可以定義自己的構造器。

與一般類的區別:

1、一般的類都是默認繼承Object類,而枚舉類默認繼承的是Java.lang.Enum類。所以枚舉類不能顯示繼承其他的父類;

2、使用enum定義的非抽象枚舉類,默認使用final修飾;

3、枚舉類的構造器只能使用private修飾;枚舉類的實例只能是枚舉值,不能隨意通過new關鍵字創建枚舉類對象;

4、枚舉類的所有實例必須放在第一行顯式列出,否則此枚舉類永遠不能產生實例;

5、枚舉類的實例,系統默認用public static final修飾

public enum Color {

    RED("R"),BLUE("b"),YELLOW("y");

    private final String abbreviation;

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

    public String getAbbreviation() {
        return abbreviation;
    }

    public static void main(String[] args) {

        Color color1 = Color.BLUE;  //直接指對對象的值

        //values方法可以得到此枚舉類的所有實例
        for (Color color : Color.values()){
            System.out.println(color);
        }
    }

}

 由於枚舉類的實例有可能只是固定的幾個值,如果使用set方法修改可能會引起一些錯誤,建議將枚舉類的成員變量都使用private final修飾。

舉個例子:

package com.company;

public enum People {
    RED("R"),BLUE("b"),YELLOW("y");

    private  String sex;

    private People(String sex) {
        this.sex = sex;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        switch (this){
            case RED:
                if (sex == "男"){
                    this.sex = sex;
                }else {
                    System.out.println("未知操作");
                    return;
                }
                break;
            case BLUE:
                if (sex == "女"){
                    this.sex = sex;
                }else {
                    System.out.println("未知操作");
                    return;
                }
                break;
            case YELLOW:
                if (sex == "未知"){
                    this.sex = sex;
                }else {
                    System.out.println("未知操作");
                    return;
                }
                break;
        }
    }

    public static void main(String[] args) {

        People people = People.valueOf("BLUE");
        people.setSex("男");   //輸出 ”未知操作“

    }

}

在此代碼中由於沒有將sex變量設置爲final,允許使用set方法去設置,導致後面sex沒有設置成功,輸出了“未知操作”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章