枚举类,一般都用在定义常量。
定义
public enum Constant {
MON("星期一"), TUE("星期二"), WED("星期三"), THU("星期四"), FRI("星期五"), SAT("星期六"), SUN("星期日");
private String desc;
private Constant(String desc) {
this.desc = desc;
}
// 非静态方法,属于具体的 Enum 队形 MON,TUE...
public String getDesc() {
return desc;
}
// 静态方法,属于 Enum 类 Constant
public static boolean containKey(String key) {
Constant[] cons = Constant.values();
for (Constant con : cons) {
if (con.name().equals(key))
return true;
}
return false;
}
}
遍历
public class Main {
public static void main(String[] args) {
// 遍历
Constant[] constants = Constant.values();
for (Constant con : constants) {
System.out.println(con);
}
}
}
-------------------------------------------------------
MON
TUE
WED
THU
FRI
SAT
SUN
enum 对象的常用方法介绍
-
int compareTo(E o)
比较此枚举与指定对象的顺序。 -
Class getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。 -
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。 -
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 -
String toString()
返回枚举常量的名称,它包含在声明中。 -
static <T extends Enum> T valueOf(Class enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
EnumSet,EnumMap 的应用
public class Test {
public static void main(String[] args) {
// EnumSet的使用
EnumSet<EnumTest> weekSet = EnumSet.allOf(Constant.class);
for (Constant day : weekSet) {
System.out.println(day);
}
// EnumMap的使用
EnumMap<Constant, String> weekMap = new EnumMap(Constant.class);
weekMap.put(Constant.MON, "星期一");
weekMap.put(Constant.TUE, "星期二");
// ... ...
for (Iterator<Entry<Constant, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
Entry<Constant, String> entry = iter.next();
System.out.println(entry.getKey().name() + ":" + entry.getValue());
}
}
}
原理分析
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum。Constant 经过反编译(javap com.beng.enums.Constant 命令)之后得到的内容如下:
警告: 二进制文件Constant包含com.beng.enums.Constant
Compiled from "Constant.java"
public final class com.beng.enums.Constant extends java.lang.Enum<com.beng.enums.Constant> {
public static final com.beng.enums.Constant MON;
public static final com.beng.enums.Constant TUE;
public static final com.beng.enums.Constant WED;
public static final com.beng.enums.Constant THU;
public static final com.beng.enums.Constant FRI;
public static final com.beng.enums.Constant SAT;
public static final com.beng.enums.Constant SUN;
public static com.beng.enums.Constant[] values();
public static com.beng.enums.Constant valueOf(java.lang.String);
public java.lang.String getDesc();
public static boolean containKey(java.lang.String);
static {};
}
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
所以 static 定义的方法 属于 Enum 类。
总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。