java枚举
Updated:
参考:http://www.cnblogs.com/hemingwang0902/archive/2011/12/29/2306263.html
《Thinking in java》
语法(定义)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum1
2
3
4
5
6
7
8
9
10package com.hmw.test;
public enum EnumTest {
MON, TUE, WED, THU, FRI, SAT, SUN;
}
这段代码实际上调用了7次 Enum(String name, int ordinal):
new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
... ...
遍历、switch 等常用操作
对enum进行遍历和switch的操作示例代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public 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 对象的常用方法介绍
1 | int compareTo(E o) |
给 enum 自定义属性和方法
除了不能继承自一个enum之外,我们基本上可以将enum看作一个常规的类。也就是说我们可以向enum中添加方法和属性,或覆盖enum的方法。
例1:
EnumTest.java文件:
1 | package lianxi; |
Lianxix.java文件:
1 | package lianxi; |
例2:
EnumTest.java文件:
1 | package lianxi; |
lianxix.java文件:
1 | package lianxi; |
说明:
如果你打算定义自己的方法,那么必须在enum实例序列的最后添加一个分号。同时java要求必须先定义enum实例。
enum中的构造器和方法和普通类除了有少许限制外没啥大的区别,enum就是一个普通类,在例1中我们有意识地将enum的构造器声明为private,但其实不声明也为private,因为我们只能在enum定义的内部使用其构造器创建enum实例。一旦enum的定义结束,编译器就不允许我们再使用其构造器来创建任何实例了。
神秘的values()
《Thinking in java》里用反射的方法分析了这个values()的由来,这里只作简单说明。 Values()方法是由编译器插入到enum定义的static方法,所以,如果将enum实例向上转型为Enum,那么vaules()方法就不可以访问了,不过,在Class中有一个getEnumConstants()方法,所以即使Enum接口中没有vaules()方法,我们仍然可以通过Class对象取得所有enum实例。1
2
3
4
5
6
7
8public static void main(String[] args)
{
EnumTest[] vals = EnumTest.values();
Enum e = EnumTest.DABAI;
//e.values(); NO values() in Enum
for(Enum en : e.getClass().getEnumConstants())
System.out.println(en);
}
补:getEnumConstants()是Class上的方法,所以甚至可以对不是枚举的类调用此方法。