java枚举类
1、为什么引入枚举类?
假设我有一个类叫Week的普通实体类,可以创建周一到周日,但是我传入周十一,这个类同样可以创建成功。为了安全调用,我们需要把可以创建的日期固定下来,但是光固定下来之后,如果类里有set方法,name还是可以背改变的,为了适应这种情况枚举类就应运而生。
Week类:
public class Week {
private String name;
private String description;
public Week(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
测试:
@Test
void t2(){
Week week01 = new Week("星期三","上班");
System.out.println(week01.getName());
Week week02 = new Week("星期十一","休息");
System.out.println(week02.getName());
}
结果:
2、枚举类是什么?
枚举(enumeration 简写 enum)简单来说就是一组有限常量的集合,而枚举类是一种特殊的类,里面只包含一组有限数量特定的类。
3、枚举类该怎么使用?
枚举类分为两种,一种是自定义枚举类,一种是java提供的enum关键字实现枚举。
自定义枚举类
-
特点
-
构造器私有化
-
本类内部创建一组对象(有限对象)
-
对外暴露对象
-
对不能改变的类型只提供get方法
-
-
步骤
-
去掉需要枚举属性的set的方法,只保留get方法
-
创建一组枚举对象,对枚举对象的属性进行final static 修饰,final确保不会被修改,static确保在类加载时保证属性只被加载一次
-
枚举对象命名全部大写(常量的命名规范)
对Week类进行改写,改写为WeekEnum类:
public class WeekEnum { private String name; private String description; public final static WeekEnum MONDAY = new WeekEnum("周一","上班"); public final static WeekEnum TUESDAY = new WeekEnum("周二","上班"); public final static WeekEnum WEDNESDAY = new WeekEnum("周三","上班"); public final static WeekEnum THURSDAY = new WeekEnum("周四","上班"); public final static WeekEnum FRIDAY = new WeekEnum("周五","上班"); public final static WeekEnum SATURDAY = new WeekEnum("周六","休息"); public final static WeekEnum SUNDAY = new WeekEnum("周日","休息"); // 私有化构造函数 private WeekEnum(String name, String description) { this.name = name; this.description = description; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
调用时会IDE自动提示:
test
@Test void t2_2(){ WeekEnum day =WeekEnum.FRIDAY; System.out.println(day.getName()+","+day.getDescription()); }
测试结果:
-
enum关键字枚举类
-
步骤
-
使用enum来代替类中的class
-
将构造器私有化
-
在第一行写枚举对象的声明,
枚举名称(参数1,参数2,...);
-
多个枚举对象需要使用
,
来连接ENUM1(parameter1,parameter2,..,parameterN),ENUM2(parameter1,parameter2,..,parameterN),ENUM3(parameter1,parameter2,..,parameterN),...ENUMN(parameter1,parameter2,..,parameterN);
-
去除需要枚举属性的set方法
代码示例:
weekEnumkey:
public enum WeekEnumKey {
MONDAY("周一","上班"),TUESDAY("周二","上班"),
WEDNESDAY("周三","上班"),THURSDAY("周四","上班"),
FRIDAY("周五","上班"),SATURDAY("周六","休息"),
SUNDAY("周日","休息");
private String name;
private String description;
// 私有化构造函数
private WeekEnumKey(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
测试代码:
@Test
void t2_3(){
WeekEnumKey day = WeekEnumKey.FRIDAY;
System.out.println(day.getName()+","+day.getDescription());
day.setDescription("下班");
System.out.println(day.getName()+","+day.getDescription());
}