枚举类
假设要创建一个季节(Season)对象
class Season{
private String name;
private String desc; // 描述
// 构造器
// get
// ...
}
思考?季节只有四个,是固定的四个对象
创建的Season对象有如下特点
- 季节是有限的四个值
- 只读,不需要修改
代码实现如下:
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;
}
}
以上,我们实现了自定义枚举类,总结如下:
- 构造器私有化
- 本类内部创建一组对象(四个,春夏秋冬)
- 对外暴露对象(通过为对象添加修饰符:public static final)
- 可以提供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编译器会自动帮助我们生成这个方法。
Enum类常用方法如下:
-
toString():
返回当前枚举类对象常量的名称。拿到枚举对象,直接打印输入此对象的信息而不是一个地址 -
values():
返回枚举类型的对象数组,该方法可以方便的遍历所有的枚举名称 -
valuesOf(String str):
可以把一个字符串转为对应的枚举对象。,返回对象信息。
有关Enum类详细介绍见API文档
小结:
-
使用enum关键字创建枚举类时,会默认继承 Enum 类,这是一个 final 类
-
将public static final Season SPRING = new Season("春天","温度") 简化为 SPRING("春天","温度"),要清楚调用的是哪个构造器
-
如果使用无参构造器 创建枚举对象,则实参列表和小括号都可以省略,例如
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; } }
-
当有多个枚举对象时,使用 ,间隔,最后一个分号结尾
-
枚举对象必须放在枚举类的首行
-
enum 实现的枚举类,仍然是一个类,但enum 会隐式的继承Enum,所以Java 单继承,所以不能再继承其他类,但是可以实现接口
public enum Music implements IPlaying{ CLASSIC_MUSIC; @Override public void play() { System.out.println("播放古典音乐..."); } } interface IPlaying { void play(); }