一,语法(定义)
创建枚举类型要使用 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实例化后,里面存储的数据是已数组来存储的,数组的长度是传入枚举类型里面个体的长度.下图是构造器
put方法
get()方法:主要由
isValidKey(key):该方法就是判断key是不是空或者是不是属于该枚举类,true则能查到值,false则返回null.
unmaskNull(vals[((Enum<?>)key).ordinal()]):该方法是把Map里的值取到后判断是不是封装的NULL,是的话则返回null不是则返回正常值