Java-枚举类
枚举类内可以直接写出所有实例。
enum Weekday {
SUN, MON, TUE, WED, THU, FRI, SAT;
}
不可能引用非枚举的值。
enum
类型的每个常量在JVM
中只有一个唯一实例,可以直接用==
if (day == Weekday.FRI) { // ok!
}
if (day.equals(Weekday.SUN)) { // ok, but more code!
}
和一般的class
有什么区别?
-
总是继承自
java.lang.Enum
,且无法被继承 -
无法通过
new
创建enum
的实例 -
定义的每个实例都是引用类型的唯一实例
-
可以将
enum
类型用于switch
语句
public enum Color {
RED, GREEN, BLUE;
}
编译器编译出的class
文件:
public final class Color extends Enum { // 继承自Enum,标记为final class
// 每个实例均为全局唯一:
public static final Color RED = new Color();
public static final Color GREEN = new Color();
public static final Color BLUE = new Color();
// private构造方法,确保外部无法调用new操作符:
private Color() {}
}
方法
方法 | 描述 |
---|---|
name() | 返回常量名 |
ordina() | 返回定义的常量的顺序 |
可以为enum
编写构造方法、字段和方法
字段强烈建议声明为final
。
enum Weekday {
MON(1, "星期一"), TUE(2, "星期二"), WED(3, "星期三"), THU(4, "星期四"), FRI(5, "星期五"), SAT(6, "星期六"), SUN(0, "星期日");
public final int dayValue;
private final String chinese;
private Weekday(int dayValue, String chinese) {
this.dayValue = dayValue;
this.chinese = chinese;
}
public String getChiese(){
return this.chinese;
}
Switch
因为枚举类天生具有类型信息和有限个枚举常量,所以比int
、String
类型更适合用在switch
语句中:
public class Main {
public static void main(String[] args) {
Weekday day = Weekday.SUN;
switch(day) {
case MON:
case TUE:
case WED:
case THU:
case FRI:
System.out.println("Today is " + day + ". Work at office!");
break;
case SAT:
case SUN:
System.out.println("Today is " + day + ". Work at home!");
break;
default:
throw new RuntimeException("cannot process " + day);
}
}
}
enum Weekday {
MON, TUE, WED, THU, FRI, SAT, SUN;
}