为什么要用枚举(enum)
- 当一个类的对象是固定的,不会有更多,如果按照以前的设计思路,用户可以自己修改对象,就不能体现这个类的对象是固定的,所以引出了枚举类。
- 所谓枚举,就是把具体的对象一个一个列举出来
- 枚举类只读,不可以修改
什么是枚举
- 是一组常量的集合
实现方式
- 自定义类实现枚举
- 使用enum关键字
自定义类实现枚举
- 将构造器私有化,防止直接new
- 去掉setXxx方法,防止属性被修改
- 在该类内部创建固定的对象
- public static final修饰对象,优化底层
package enum_;
public class EnumDemo {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.AUTUMN);
}
}
class Season {
private String name;
public final static Season SPRING = new Season("春");
public final static Season SUMMER = new Season("夏");
public final static Season AUTUMN = new Season("秋");
public final static Season WINTER = new Season("冬");
private Season(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
'}';
}
}
使用关键字enum
- 使用enum代替class
public final static Season SPRING = new Season("春");
被SPRING("春天")
代替- 如果有多个常量,用,间隔
- 把定义的常量写在最前面
package enum_;
/**
* @author: ashling
* @description: 使用enum实现枚举
* @date: 2021/10/31 8:24 下午
*/
public class EnumDemo1{
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.AUTUMN);
}
}
enum Season1 {
// 把定义的常量写在最前面
SPRING("春天"),SUMMER("夏天");
private String name;
private Season1(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
'}';
}
}
注意事项
- 使用enum关键字开发枚举类,会默认继承Enum类
- 如果使用无参构造器,则在创建枚举对象的时候可以把()省略
- 枚举对象要放在枚举类的最前面
enum常用方法
ordinal()
输出的是该枚举对象的次序,从0开始编号
values()
含有定义的所有枚举对象
valuesOf()
将字符串转成枚举对象,要求字符串必须为已有的常量名
compareTo()
比较两个枚举常量,比较的是编号
enum实现接口
- 使用enum之后不能再继承其他类,因为enum隐式继承了Enum
- enum仍然是个类,所以可以实现接口
interface IRest {
public void rest();
}
enum Week implements IRest{
MONDAY("周一"),TUESDAY("周二"),WEDNESDAY("周三"),
THURSDAY("周四"),FRIDAY("周五"),SATURDAY("周六"),SUNDAY("周日");
private String day;
Week(String day) {
this.day = day;
}
@Override
public String toString() {
return day;
}
@Override
public void rest() {
System.out.println("一周内有2天休息。");
}
}