自定义类实现枚举

一、问题:创建季节(Season)对象,请设计完成?

分析:创建季节对象有如下特点:

  1. 季节的值是有限的几个值(spring,summer,autumn,winter)
  2. 只读,不需要修改

二、解决方案--枚举

枚举的特点

  1. 枚举是一组常量的集合
  2. 枚举属于一种特殊的类,里面只包含一组有限的特定对象
  3. 构造器私有化
  4. 对外暴露对象
  5. 可以提供get方法,但是不能提供set方法

枚举的实现方式
A、自定义实现枚举

查看代码
//枚举类实现
class Season {
    private String name;
    private String desc;

    //在Season内部创建固定的对象
    public static Season SPRING = new Season("春天", "温暖");
    public static Season WINNER = new Season("冬天", "寒冷");
    public static Season AUTUMN = new Season("秋天", "凉爽");
    public static Season SUMMER = new Season("夏天", "炎热");

    //构造器私有化,防止直接new
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    //只设置get方法,防止属性被修改
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}
B、关键字(enum)实现枚举:
  1. 使用关键字enum替代class
  2. 语法格式:常量名(参数列表)
  3. 如果有多个常量对象,对象之间用逗号即可
  4. 常量对象写在最前面
查看代码
//枚举类实现
enum Season {

    SPRING("春天", "温暖"),
    WINNER("冬天", "寒冷"),
    AUTUMN("秋天", "凉爽"),
    SUMMER("夏天", "炎热");

    private String name;
    private String desc;


    //构造器私有化,防止直接new
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    //只设置get方法,防止属性被修改
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

三、枚举常用方法

查看代码
 public static void main(String[] args) {
        Season autumn = Season.AUTUMN;
        //name():输出枚举对象的名称
        System.out.println(autumn.name());
        //ordinal():输出枚举对象的编号,编号从0开始
        System.out.println(autumn.ordinal());
        //values():枚举对象的数组
        Season[] seasons = Season.values();
        for (int i = 0; i < seasons.length; i++) {
            System.out.println(seasons[i]);
        }
        //valueOf():将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
        Season autumn1 = Season.valueOf("AUTUMN");
        System.out.println(autumn1);
        // compareTo:返回两个枚举常量的编号差
        System.out.println(Season.AUTUMN.compareTo(Season.WINNER));
    }

四、枚举使用细节

  1. 使用enum关键字后,不能再继承其他类
  2. enum实现枚举类后,仍然是可以实现接口的
上一篇:稀疏表示学习(二)-- 如何计算稀疏表示


下一篇:RPC接口不允许使用枚举类型。为什么?