enum(枚举) 的全称为 enumeration, 是 JDK 1.5 中引入的新特性。在Java中,通过关键字enum来定义枚举类。枚举的本质是java.lang.Enum 的子类。枚举类是一种特殊类,它和普通类一样可以使用构造器、定义成员变量和方法,也能实现一个或多个接口,但枚举类不能继承其他类。枚举的提出是为了将常量组织起来,进行统一管理。枚举的典型应用场景为:错误码、状态机等。
枚举定义形式如下:
enum Color { RED, GREEN, BLUE; }
//注:如果枚举中没有定义方法,也可以在最后一个实例后面加逗号、分号或什么都不加。
JDK7以后,switch已经支持 int、char、String、enum 类型的参数。我们可以使用switch语句来写状态机。代码如下:
Week value = valueOf("MONDAY");
//switch 状态机的使用
switch (value) {
case MONDAY:
System.out.println("星期一");
break;
case TUESDAY:
System.out.println("星期二");
break;
case WEDNESDAY:
System.out.println("星期三");
break;
case THURSDAY:
System.out.println("星期四");
break;
case FRIDAY:
System.out.println("星期五");
break;
case SATURDAY:
System.out.println("星期六");
break;
case SUNDAY:
System.out.println("星期天");
break;
default:
break;
}
特定的常量类型与主体中的方法或行为有关时,即当数据与行为之间有关联时,可以考虑使用枚举来实现策略模式。代码如下:
package com.gump.enums;
public enum Week {
//枚举实例
MONDAY(1,WeekType.WEEKDAY),
TUESDAY(2,WeekType.WEEKDAY),
WEDNESDAY(3,WeekType.WEEKDAY),
THURSDAY(4,WeekType.WEEKDAY),
FRIDAY(5,WeekType.WEEKDAY),
SATURDAY(6,WeekType.WEEKEND),
SUNDAY(7,WeekType.WEEKEND);
//成员变量
private int id;
private WeekType weekType;
/**
* 构造方法
*/
Week(int id, WeekType weekType) {
this.id = id;
this.weekType = weekType;
}
/**
* 普通方法
*/
public void whatTodo(){
weekType.todo();
}
/**
* 静态方法
*/
public static void deal(){
System.out.println("静态方法");
}
//策略枚举
private enum WeekType{
WEEKDAY("工作日") {
@Override
public void todo() {
System.out.println(WEEKDAY.memo + "搬砖");
}
},
WEEKEND("休息日") {
@Override
public void todo() {
System.out.println(WEEKEND.memo + "带娃");
}
};
private String memo;
WeekType(String memo) {
this.memo = memo;
}
/**
* 抽象方法
*/
public abstract void todo();
}
}
枚举的使用,其实就是归纳了同类型的常量,更易于使用及统一管理。
有兴趣的可以进一步了解枚举相关的其他知识: