1.枚举概述
枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常熟。当一个变量有几种固定可能的取值时,就可以将其定义为枚举类型。
1.1 声明枚举
Java中枚举是一个特殊的类,使用enum关键字来定义,常量之间使用逗号‘,‘来分割。
可定义枚举名称、可访问性基础类型和成员等,声明格式如下:
enum-modifiers enum enumname:enum-base {
enum-body,
}
- enum-modifiers 枚举可访问性,包含public,private,internal (同一应用程序集内部(单独的项目,而不是整个解决方案)
- enumname 枚举名称
- enum-base 枚举的基础类型 (默认为int)
- enum-body 枚举的成员(枚举类型的命名常数)
注:任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔。
2.枚举类
如1.1所述,Java中的枚举为特殊的类,均继承自java.lang.Enum类。每个枚举类型成员可看作为一个Enum类的实例,默认被final,public,static修饰,使用枚举类型成员时直接使用枚举名称调用成员即可。
枚举实例常调用的Enum类方法如下:
一些具体用法:
public class EnumTest {
public static void main(String[] args){
System.out.println(SexEnum.valueOf("male").ordinal());
System.out.println(SexEnum.values()[0].ordinal());
}
}
enum SexEnum{
male,female;
}
3.为枚举添加方法
枚举常量可以有自己的方法,此时需注意:
需在枚举实例的最后一个成员后添加分号,且必须先定义枚举实例。
eg.创建WeekDay枚举
enum WeekDay{
Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thusday"),
Fri("Friday"),Sat("Saturday"),Sun("Sunday");
private String day;
WeekDay(String day) {
this.day = day;
}
public static String getDay(int i){
switch(i){
case 1:
return WeekDay.Mon.day;
case 2:
return WeekDay.Tue.day;
default:
System.out.println("Wrong Number!");
return null;
}
}
//重写了父类的方法
@Override
public String toString() {
return day;
}
}
注:若枚举类中含抽象方法,则需在枚举类中的每个对象都将其实现
enum SexEnum{
male{
public String getSex(){
return("Male");
}
},
female{
public String getSex(){
return("Female");
}
};
public abstract String getSex();
}
4.EnumMap与EnumSet
4.1 EnumMap类
EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。
定义方法:Map<SexEnum, Integer> map1 = new EnumMap<SexEnum, Integer>(SexEnum.class);
4.2 EnumSet类
EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。
EnumSet 提供了许多工厂方法以便于初始化,如下所示
定义方法:
EnumSet\<SexEnum> set = EnumSet.of(SexEnum.female);
Set\<SexEnum> set1 = EnumSet.complementOf(set);