Java基础 | 枚举

Java基础 | 枚举

枚举类

  • 如果一个类的对象只有有限个且是确定的,称此类为枚举类,所以,如果需要定义一组常量时,建议使用枚举类
  • Java 5 提供了新特性:枚举类型 enum,如果不使用 enum 而自定义枚举类
public class Season {
    // 1. 声明 Season 对象的属性
    private final String name;
    private final String description;

    // 2. 私有构造器,并给对象属性赋值
    private Season(String name, String description) {
        this.name = name;
        this.description = description;
    }

    // 3. 提供当前枚举类的多个对象,设置为全局常量
    public static final Season SPRING = new Season("春天","草长莺飞");
    public static final Season SUMMER = new Season("夏天","火伞高张");
    public static final Season AUTUMN = new Season("秋天","叠翠流金");
    public static final Season WINTER = new Season("冬天","银装素裹");

    // 4. 其他诉求:get 方法 toString 方法
    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

enum 关键字定义枚举类

使用 enum 关键字而不是 class 定义枚举类,此类默认继承于 java.lang.Enum

enum Season {
    // 1. 提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
    SPRING("春天","草长莺飞"),
    SUMMER("夏天","火伞高张"),
    AUTUMN("秋天","叠翠流金"),
    WINTER("冬天","银装素裹");

    // 2. 声明 Season 对象的属性
    private final String name;
    private final String description;

    // 3. 私有构造器,并给对象属性赋值
    private Season(String name, String description) {
        this.name = name;
        this.description = description;
    }

    // 4. 其他诉求:get 方法 toString 方法
    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
    /*
    // Enum 类已经重写了 toString,也可根据自己的诉求决定是否在此枚举类中重写

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
    */
}

Enum 类

Enum 类常用方法

// 返回枚举类对象的名称
String toString()

// 返回一个该枚举类对象构成的数组
T[] values()

// 返回枚举类中对象名是 objName 的对象
// 如果不存在 objName 的枚举类对象,则抛出 IllegalArgumentException 异常
T valueOf(String objName)

测试使用

public class EnumTest {
    public static void main(String[] args) {
        // 调用 Enum 类的 toString()
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
        // 获取枚举类的对象数组
        Season[] value = Season.values();
        for(Season s : value) {
            System.out.println(s.getName() + "," + s.getDescription());
        }
        // 通过对象名获取枚举类的对象
        Season winter = Season.valueOf("WINTER");
        System.out.println(winter.getDescription());
    }
}

枚举类实现接口

让枚举类的对象分别实现接口

interface ShowInfo {
    void show();
}

enum Season implements ShowInfo {
    // 分别实现接口,实现各自的抽象方法
    SPRING("春天","草长莺飞") {
        @Override
        public void show() {
            System.out.println("春天的故事");
        }
    },
    SUMMER("夏天","火伞高张") {
        @Override
        public void show() {
            System.out.println("宁夏");
        }
    },
    AUTUMN("秋天","叠翠流金") {
        @Override
        public void show() {
            System.out.println("枫");
        }
    },
    WINTER("冬天","银装素裹") {
        @Override
        public void show() {
            System.out.println("大约在冬季");
        }
    };
    // ... ...
}

枚举实现单例模式

枚举类型是线程安全的,并且只会装载一次

public class Bank {
    // 私有化构造器
    private Bank() {}
    // 使用枚举创建单例
    private enum Singleton {
        INSTANCE;
        private final Bank instance;
        Singleton() {
            instance = new Bank();
        }
        private Bank getInstance() {
            return instance;
        }
    }
    // 提供获取单例的接口
    public static Bank getInstance() {
        return Singleton.INSTANCE.getInstance();
    }
}