一、enum的语法与基本作用
创建一个枚举类型需要使用关键字enum,隐含了所创建的类都是java.lang.Enum的子类。枚举类型的每一个值都被映射到protect enum(String name, int ordinal);的构造函数中,在这里枚举的每一个值都被转换成一个字符串,并且同时对应一个下标(从0开始的)。
在实际开发中往往需要处理一些“数据集”,这些数据集在程序中是相对稳定的,如一周的七天或一年四季等,这时枚举就派上了用处。
public enum TestEnum{
//这里的每一个值其实也相当于是一个实例
MON, TUE, WED, THU, FRI, SAT, SUN;
}
//这段代码其实相当于调用了7次protect enum(String name, int ordinal);
new Enum<TestEnum>("MON", 0);
new Enum<TestEnum>("TUE", 1);
......
二、遍历、switch 等常用操作
对enum进行遍历和switch的操作示例代码:
public class Test {
public static void main(String[] args) {
for (EnumTest e : EnumTest.values()) {
System.out.println(e.toString());
}
System.out.println("----------------我是分隔线------------------");
EnumTest test = EnumTest.TUE;
switch (test) {
case MON:
System.out.println("今天是星期一");
break;
case TUE:
System.out.println("今天是星期二");
break;
// ... ...
default:
System.out.println(test);
break;
}
}
}
输出结果:
MON
TUE
WED
THU
FRI
SAT
SUN
—————-我是分隔线——————
今天是星期二
enum 对象的常用方法介绍
int compareTo(E o)
比较此枚举与指定对象的顺序。
Class getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString()
返回枚举常量的名称,它包含在声明中。
static
public class Test {
public static void main(String[] args) {
EnumTest test = EnumTest.TUE;
//compareTo(E o)
switch (test.compareTo(EnumTest.MON)) {
case -1:
System.out.println("TUE 在 MON 之前");
break;
case 1:
System.out.println("TUE 在 MON 之后");
break;
default:
System.out.println("TUE 与 MON 在同一位置");
break;
}
//getDeclaringClass()
System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());
//name() 和 toString()
System.out.println("name(): " + test.name());
System.out.println("toString(): " + test.toString());
//ordinal(), 返回值是从 0 开始
System.out.println("ordinal(): " + test.ordinal());
}
}
输出结果:
TUE 在 MON 之后
getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1
三、给枚举类型自定义属性和方法
public enum TestEnum{
//必须写在第一行,要么全部赋值要么全不赋值
MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6), SUN(0){
public int text(){
return i;
}
};
private int value;
private TestEnum(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
public static void main(String[] args) {
System.out.println(EnumTest.WED.getValue(););
}
四、EnumMap和EnumSet的应用
public static void main(String[] args) {
// EnumSet的使用
EnumSet<TestEnum> weekSet = Enum.allOf(TestEnum.class);
for(TestEnum day : weekSet){
System.out.println(day);
}
// EnumMap的使用
EnumMap<TestEnum, String> weekMap = new EnumMap(TestEnum.class);
weekMap.put(TestEnum.MON, "星期一");
for(Iterator<Entry<TestEnum, String>> iter = weekMap.entrySet().iterator(); iter.hashNext();){
Entry<TestEnum, String> entry = iter.next();
System.out.println(entry.getKey().name + entry.getValue());
}
}
总结
实际上可以吧enum看做一个普通的class类,他们都可以定义自己的属性和方法,不同之处在于enum不可以继承,因为java是单继承,已经继承了java.lang.Enum.