Java - enum class

By sunwc 2023-03-27 Java

為什麼要使用列舉類?

當我們在開發中,有一組常數對應不同的狀態來顯示時,就可以考慮使用 enum class

方式一、自定義列舉類

/**
 * 自定義列舉類
 * @author sunwc
 * @create 2023-03-27 下午 03:53
 */
public class Season {

    // 1. 宣告Season物件的屬性:private final 修飾
    private final String name;
    private final String desc;

    // 2. 私有的建構子,將屬性指定值
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    /**
     * 提供列舉物件:public static final 修飾
     */
    public static final Season SPRING = new Season("spring", "春暖花開");
    public static final Season SUMMER = new Season("summer", "盛夏光年");
    public static final Season AUTUMN = new Season("autumn", "秋高氣爽");
    public static final Season WINTER = new Season("winter", "寒風凜凜");

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Season{");
        sb.append("name='").append(name).append('\'');
        sb.append(", desc='").append(desc).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

class EnumClassTest {

    @Test
    public void getEnumSeason() {

        System.out.println(Season.SPRING.getName());
        System.out.println(Season.AUTUMN.getDesc());
        System.out.println(Season.WINTER.toString());
    }
}

方式二、使用 enum 關鍵字定義 列舉類

  • 定義的列舉類 默認繼承於 java.lang.Enum

  • 常用方法

    1.values()

    2.valueOf()

    3.toString()

  • enum 列舉類可以 implements interface

/**
 * 使用enum關鍵字定義列舉類
 * @author sunwc
 * @create 2023-03-27 下午 03:53
 */
public enum Season1 implements Info {


    /**
     * 提供列舉物件
     */
    SPRING("spring", "春暖花開") {
        @Override
        public void show() {
            System.out.println("這是有關春天的訊息");
        }
    },
    SUMMER("summer", "盛夏光年") {
        @Override
        public void show() {
            System.out.println("這是有關夏天的訊息");
        }
    },
    AUTUMN("autumn", "秋高氣爽") {
        @Override
        public void show() {
            System.out.println("這是有關秋天的訊息");
        }
    },
    WINTER("winter", "寒風凜凜") {
        @Override
        public void show() {
            System.out.println("這是有關冬天的訊息");
        }
    };

    // 宣告Season1物件的屬性:private final 修飾
    private final String name;
    private final String desc;

    // 2. 私有的建構子,將屬性指定值
    private Season1(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }



    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

}

class EnumKeywordTest {

    @Test
    public void getEnumSeason1() {

        System.out.println(Season1.class.getSuperclass()); // class java.lang.Enum
        System.out.println(Season1.SPRING.getName());
        System.out.println(Season1.AUTUMN.getDesc());
        System.out.println(Season1.WINTER);

        // 遍歷所有列舉物件並調用interface抽象方法 show()
        for (int i = 0; i < Season1.values().length; i++) {
            Season1.values()[i].show();
        }
    }
}

/**
 * 自定義 interface
 */
interface Info {

    void show();
}

輸出結果:

class java.lang.Enum
spring
秋高氣爽
WINTER
這是有關春天的訊息
這是有關夏天的訊息
這是有關秋天的訊息
這是有關冬天的訊息