JDK 5提供了enum关键字,实现了对枚举类型的支持。
枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,就是一个枚举。
1.枚举的实现
public enum Week {
实现一个枚举是相当简单的,和实现一个类基本上差不多,只要使用enum这个关键字就可以了。枚举实际上继承了Enum这个抽象类,因为Java的单继承性,所以我们自己实现的枚举不能再继承别的类了。SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;}
2.枚举的实用
为了实用枚举,需要创建一个该类型的引用,并将其赋值给某个实例:
Week week =Week.
MONDAY ;
尽管enum看起来像是一种新的数据类型,但是在很大程度上,我们可以讲enum当成一个普通类来处理。事实上enum确实是类,并且具有自己的方法。
enum有一个特别适用的特性,就是和可以在switch语句内使用:
3.枚举中添加新方法public static void main(String[] args) {Week week = Week.TUESDAY;switch(week){case SUNDAY:System.out.println("SUNDAY");break;case MONDAY:System.out.println("MONDAY");break;case TUESDAY:System.out.println("TUESDAY");break;case THURSDAY:System.out.println("THURSDAY");break;case WEDNESDAY:System.out.println("WEDNESDAY");break;case FRIDAY:System.out.println("FRIDAY");break;case SATURDAY:System.out.println("SATURDAY");break;}}
如果打算自定义自己的方法,那么必须在enum
实例序列的最后添加一个分号。而且
Java
要求必须先定义
enum
实例。 因为枚举实际上继承了Enum,所以可以覆盖父类中的一些方法,通常我们会覆盖toString(),以此来方便调试。
public enum Week {
4.枚举实现接口//必须先定义实例,并以分好结束实例的定义SUNDAY(0,"星期天"),MONDAY(1,"星期一"),TUESDAY(2,"星期二"),WEDNESDAY(3,"星期三"),THURSDAY(4,"星期四"),FRIDAY(5,"星期五"),SATURDAY(6,"星期六");// 成员变量private String name;private int value;//构造方法 且不能是public,否则编译出错Week(int value, String name){this.name = name;this.value = value;}public String getName() {return name;}public int getValue() {return value;}@Overridepublic String toString() {return name + ":" +value;}public static void main(String[] args) {Week week = Week.TUESDAY;switch(week){case SUNDAY:System.out.println("SUNDAY");break;case MONDAY:System.out.println("MONDAY");break;case TUESDAY:System.out.println("TUESDAY");break;case THURSDAY:System.out.println("THURSDAY");break;case WEDNESDAY:System.out.println("WEDNESDAY");break;case FRIDAY:System.out.println("FRIDAY");break;case SATURDAY:System.out.println("SATURDAY");break;}}}
枚举可以当做一个普通类,所以可以像普通类一样来实现接口,实现接口的方法也和普通类一样
interface Info{
public String getInfo();
}
public enum Week implements Info{
@Override
public String getInfo() {
return null;
}
}
5.遍历枚举
枚举提供了values()方法,可以用这个方法很轻松的实现多枚举的遍历
for(Week w : Week.values()){System.out.println(w);}
因为我们覆盖了toString(),所以输出结果为:
星期天:0
值得补充的一点是:values()方法是编译器插入到enum定义中的static方法。所以,当你将enum实例向上转型为父类Enum时,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例。星期一:1星期二:2星期三:3星期四:4星期五:5星期六:6
6. EnumMap
public class EnumMap<K extends Enum<K>,V>
extends AbstractMap<K,V>
implements Serializable, Cloneable
如下例:
//以枚举类型当key,必须指定类型
EnumMap<Week, String> map = new EnumMap<Week, String>(Week.class);
map.put(MONDAY, "一");
map.put(TUESDAY, "二");
map.put(WEDNESDAY, "三");
map.put(THURSDAY, "四");
map.put(FRIDAY, "五");
map.put(SATURDAY, "六");
map.put(SUNDAY, "七");
7.Enumset
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable
与枚举类型一起使用的专用 Set 实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。枚举 set 在内部表示为位向量。此表示形式非常紧凑且高效。此类的空间和时间性能应该很好,足以用作传统上基于 int 的“位标志”的替换形式,具有高品质、类型安全的优势。如果其参数也是一个枚举 set,则批量操作(如 containsAll 和 retainAll)也应运行得非常快。
此类可以帮助我们建立枚举值的集合,里面提供了一系列的静态方法,可以指定不同的集合建立方式。
public static <E extends Enum<E>> EnumSet<E> of(E first,
E... rest)
创建一个最初包含指定元素的枚举 set。此工厂方法的参数列表使用变量参数功能,该方法可以创建一个最初包含任意个元素的枚举 set,但是这样很可能比不使用变量参数的重载运行得慢。
参数:
first - 此 set 最初要包含的元素
rest - 此 set 最初要包含的其余元素
返回:
最初包含指定元素的枚举 set
抛出:
NullPointerException - 如果任意参数为 null,或 rest 为 null
EnumSet<Week> set = EnumSet.of(MONDAY,TUESDAY);
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)
创建一个具有指定元素类型的空枚举 set。
参数:
elementType - 此枚举 set 的元素类型的 class 对象
抛出:
NullPointerException - 如果 elementType 为 null
EnumSet<Week> set2 = EnumSet.noneOf(Week.class);
set2.add(MONDAY);
8 .枚举中定义抽象方法f
SUNDAY(0,"星期天") {
@Override
public void print() {
// TODO Auto-generated method stub
}
},
MONDAY(1,"星期一") {
@Override
public void print() {
}
},
TUESDAY(2,"星期二") {
@Override
public void print() {
}
},
WEDNESDAY(3,"星期三") {
@Override
public void print() {
}
},
THURSDAY(4,"星期四") {
@Override
public void print() {
}
},
FRIDAY(5,"星期五") {
@Override
public void print() {
}
},
SATURDAY(6,"星期六") {
@Override
public void print() {
}
};
public abstract void print();