Java基础复习——枚举类

枚举类

假设要创建一个季节(Season)对象

class Season{
    private String name;
    private String desc; // 描述
	// 构造器
    // get
    // ...
}

思考?季节只有四个,是固定的四个对象

创建的Season对象有如下特点

  1. 季节是有限的四个值
  2. 只读,不需要修改

代码实现如下:

public class Season1 {
    private String name;
    private String desc;

    // 1. 将构造器私有化,目的防止直接new
    // 2. 去掉set方法,防止属性被修改
    // 3.  在Season内部,直接创建固定的对象
    public static final Season1 SPRING = new Season1("Spring", "温暖");
    public static final Season1 SUMMER = new Season1("Summer", "炎热");
    public static final Season1 AUTUMN = new Season1("Autumn", "凉爽");
    public static final Season1 WINTER = new Season1("Winter", "寒冷");
     private Season1(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}

以上,我们实现了自定义枚举类,总结如下:

  1. 构造器私有化
  2. 本类内部创建一组对象(四个,春夏秋冬)
  3. 对外暴露对象(通过为对象添加修饰符:public static final
  4. 可以提供get方法,但不提供set方法

enum关键字实现枚举

public enum Season {
    //public static final Season1 SPRING = new Season1("Spring", "温暖");
    // 因为使用了enum,上面的代码可以简化成
    SPRING("春天", "温暖"), SUMMAR("夏天", "炎热"),
    AUTUMN("秋天", "凉爽"), WINTER("冬天", "寒冷");

    private String name;
    private String desc;

    Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}

javap反编译后,可以看到枚举类Season继承了 java.lang 包下的 Enum 类。其中的 valuesOf(String)是Enum中继承来的方法。java中的enum关键字背后实际是Enum这个类实现的。

在我们编写自定义的enum时,其中是不含values方法的,再编译java文件时,java编译器会自动帮助我们生成这个方法。

image

Enum类常用方法如下:

  • toString():
    返回当前枚举类对象常量的名称。拿到枚举对象,直接打印输入此对象的信息而不是一个地址

  • values():
    返回枚举类型的对象数组,该方法可以方便的遍历所有的枚举名称

  • valuesOf(String str):
    可以把一个字符串转为对应的枚举对象。,返回对象信息。
    有关Enum类详细介绍见API文档

小结:

  1. 使用enum关键字创建枚举类时,会默认继承 Enum 类,这是一个 final

  2. 将public static final Season SPRING = new Season("春天","温度") 简化为 SPRING("春天","温度"),要清楚调用的是哪个构造器

  3. 如果使用无参构造器 创建枚举对象,则实参列表和小括号都可以省略,例如

    public enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE; }
    

    构造器,方法和属性根据需要创建,构造器只是在构建枚举常量时被调用

    enum Size {
        SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("Xl");
    
        private String abbreviation;
    
        Size(String abbreviation) {
            this.abbreviation = abbreviation;
        }
    
        public String getAbbreviation() {
            return abbreviation;
        }
    }
    
    
  4. 当有多个枚举对象时,使用 间隔,最后一个分号结尾

  5. 枚举对象必须放在枚举类的首行

  6. enum 实现的枚举类,仍然是一个类,但enum 会隐式的继承Enum,所以Java 单继承,所以不能再继承其他类,但是可以实现接口

    public enum Music implements IPlaying{
        CLASSIC_MUSIC;
    
        @Override
        public void play() {
            System.out.println("播放古典音乐...");
        }
    }
    
    interface IPlaying {
        void play();
    }
    
posted @ 2023-07-01 09:55  墨染启明  阅读(26)  评论(0编辑  收藏  举报