前言
对于枚举我们见怪不怪了,很简单把以前申明类的class
改为enum
,类体里逗号分隔 各个枚举量就完成了,如java日志级别枚举类。
public enum Level {
ERROR,
WARN,
INFO,
DEBUG,
TRACE;
}
枚举常量严格按照声明时顺序ordinal
依次为ERROR:0
,WARN:1
,INFO:2
,DEBUG:3
,TRACE:4
反编译枚举看看它如何被编译的:
public final class Level
extends Enum<Level> {
public static final /* enum */ Level ERROR = new Level();
public static final /* enum */ Level WARN = new Level();
public static final /* enum */ Level INFO = new Level();
public static final /* enum */ Level DEBUG = new Level();
public static final /* enum */ Level TRACE = new Level();
private static final /* synthetic */ Level[] $VALUES;
public static Level[] values() {
return (Level[])$VALUES.clone();
}
public static Level valueOf(String name) {
return Enum.valueOf(Level.class, name);
}
private Level() {
}
private static /* synthetic */ Level[] $values() {
return new Level[]{ERROR, WARN, INFO, DEBUG, TRACE};
}
static {
$VALUES = Level.$values();
}
}
- 继承了
Enum
类,所以枚举无法被继承,也就防止了增加扩展枚举的可能。 private
构造器,避免了实列化,保证枚举数据一致性。
为什么要用枚举
- 常量可以代替枚举,但是如果常量中定义不同名称但值相同的常量,虽然语法上没有问题,但这个相同值很容易引起混淆。
- 枚举可以通过方法、构造器来携带更多的信息。常量类就没这么灵活了(常量类型设置为带属性的自定义类,这时需要保证自定义类安全性),灵活性就受限。
这样使用简单明了,省区了纷繁复杂的编码。安全简洁。
public enum Level {
ERROR("错误",11),
WARN("警告",12),
INFO("信息",13),
DEBUG("调试",14),
TRACE("跟踪",15);
Level(String des, int code) {
this.code = code;
this.description = des;
}
private int code;
private String description;
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
}