一,语法(定义)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>
,而 E
表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal)
构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
枚举(enum),是指一个经过排序的、被打包成一个单一实体的项列表。
个人理解,枚举里的各个组成个体,都是一个简单的Enum实体.
这种是简单类型:enum里的MONDAY相当于Enum("MONDAY",0);以此类推
public enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
还有就是带有构造方法的复杂类型:该enum里的RED还是相当于Enum("RED",0),但是该类型还可以调用该类里的方法获取到构造器里的内容:比如Color.RED.getName()就能获取"红色";从中可以看出每个个体都使用到类的方法,也可以重写公用的方法,具体可在个体里面重写方法体,下面的yellow()方法就可以看出是重写的
Color.YELLO.yellow(); ----->woshi yello
Color.RED.yellow();----->我们不一样
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3){
void yellow(){
System.out.println("woshi blank");
}
}, YELLO("黄色", 4){
void yellow(){
System.out.println("woshi yello");
}
};
private String name ;
private int index ;
private Color( String name , int index ){
this.name = name ;
this.index = index ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
void yellow(){
System.out.println("我们不一样");
}
总结:这两种方式共同点都可以调用Enum类里的方法,不同点是复杂的enum类也可以调用自己封装的方法.
枚举是从jdk1.5版本支持的,使用是为了更加方便代码的管理和维护,是常量类的加强版,单例性.
使用案例:
public static void main(String[] args) {
System.out.println(Color.YELLO.ordinal());
Color red=Color.RED;
System.out.println(red instanceof Enum);
System.out.println(red);
System.out.println(red.values().length);
Color valueOf = Color.valueOf("RED");
System.out.println(valueOf.getName());
Color[] values = Color.values();
for(Color c:values){
Class<Color> declaringClass = c.getDeclaringClass();
System.out.println(declaringClass);
System.out.println(c instanceof Enum );
System.out.println(c.getIndex()+"---------------"+c.getName());
}
Color.YELLO.yellow();
Color.RED.yellow();
Color.showColor(Color.YELLO);
System.out.println(Day.FRIDAY.name());
}
结果:
3
true
RED
4
红色
class app.thread.Color
true
1---------------红色
class app.thread.Color
true
2---------------绿色
class app.thread.Color
true
3---------------白色
class app.thread.Color
true
4---------------黄色
woshi yello
我们不一样
YELLO
FRIDAY
EnumMap:该Map主要就是为枚举使用实现的功能类.该Map的key必须是属于枚举类的类型,且key不能为空,但是value是可以为空的,且EnumMap实例化后,里面存储的数据是已数组来存储的,数组的长度是传入枚举类型里面个体的长度.下图是构造器
泛型K在声明时K是继承枚举类的.所以构造器传入参数必须是枚举类型的class
put方法
get()方法:主要由
isValidKey(key):该方法就是判断key是不是空或者是不是属于该枚举类,true则能查到值,false则返回null.
unmaskNull(vals[((Enum<?>)key).ordinal()]):该方法是把Map里的值取到后判断是不是封装的NULL,是的话则返回null不是则返回正常值