枚举
public enum EnumDay{ SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THRUSDAY, FRIDAY, SATURDAY; }
这就定义了SUNDAY~SATURDAY的枚举了。
上面的EnumDay其实隐含了所创建的类型都是java.lang.Enum类的子类,枚举类型符合通用模式Class Enum<E extends Enum<E>>,E表示的就是枚举类型的名称。枚举类型的每
一个值都将映射到protected Enum<String name, int ordinal>构造函数中,在这里,每个值的名称都被转换为一个字符串,并且序数设置表示了此设置被创建的顺序。
new Enum<EnumDay>("SUNDAY", 0); new Enum<EnumDay>("MONDAY", 1); new Enum<EnumDay>("TUESDAY", 2); new Enum<EnumDay>("WEDNESDAY", 3); new Enum<EnumDay>("THRUSDAY", 4); new Enum<EnumDay>("FRIDAY", 5); new Enum<EnumDay>("SATURDAY", 6);
所以,每个枚举值都是一个泛型为EnumDay的Enum就可以了。
EnumDay sunday = EnumDay.SUNDAY;
遍历枚举类型及枚举方法
既然知道了枚举类型里面的枚举值都是一个Enum<EnumDay>,那就好办了,可以查看JDK API来看下Enum里面有哪些方法并使用下,看一下例子:
详情见参考。
为枚举类型中的枚举值定义数值----自定义属性和方法
重写了两次toString()方法,自定义getValue()方法,自定义属性value。
public enum EnumDay{ SUNDAY(123), MONDAY(234), TUESDAY(345), WEDNESDAY(456), THURSDAY(567), FRIDAY(678), SATURDAY(789){ @Override public String toString() { return "aaa-" + getValue(); } }; @Override public String toString() { return "bbb-" + getValue(); } private int value; private EnumDay(Integer value){ this.value = value; } public int getValue() { return value; } public static void main(String[] args) { EnumSet<EnumDay> enumDays = EnumSet.allOf(EnumDay.class); for(EnumDay enumDay : enumDays) { System.out.println(enumDay.name() + ": " + enumDay.toString()); } System.out.println("============="); for(EnumDay enumDay : enumDays) { System.out.println(enumDay.getValue() + "===" + enumDay.value); } } }
结果:
SUNDAY: bbb-123 MONDAY: bbb-234 TUESDAY: bbb-345 WEDNESDAY: bbb-456 THURSDAY: bbb-567 FRIDAY: bbb-678 SATURDAY: aaa-789 ============= 123===123 234===234 345===345 456===456 567===567 678===678 789===789
枚举中的每一个(类似SUNDAY、MONDAY。。。),都是一个泛型为EnumDay的Enum,toString()时自己有就用自己的,没有的话就用公共的。
EnumSet、EnumMap
EnumSet和EnumMap是分别为枚举类型定制的Set和Map,看一下它们的用法:
public enum EnumDay{ SUNDAY(123), MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; private int value; private EnumDay(Integer value){ this.value = value; } private EnumDay(){ } public int getValue() { return value; } public static void main(String[] args) { EnumSet<EnumDay> enumDays = EnumSet.allOf(EnumDay.class); for(EnumDay enumDay : enumDays) { System.out.println(enumDay.name() + ":" + enumDay.getValue()); } EnumMap<EnumDay, String> enumMap = new EnumMap<>(EnumDay.class); enumMap.put(EnumDay.SUNDAY,"星期天"); enumMap.put(EnumDay.MONDAY,"星期一"); enumMap.put(EnumDay.TUESDAY,"星期二"); enumMap.put(EnumDay.WEDNESDAY,"星期三"); Iterator<Map.Entry<EnumDay, String>> iterator = enumMap.entrySet().iterator(); while(iterator.hasNext()){ Map.Entry<EnumDay, String> next = iterator.next(); System.out.println(next.getKey().name() + ":" + next.getValue()); } } }
结果:
SUNDAY:123 MONDAY:0 TUESDAY:0 WEDNESDAY:0 THURSDAY:0 FRIDAY:0 SATURDAY:0 SUNDAY:星期天 MONDAY:星期一 TUESDAY:星期二 WEDNESDAY:星期三
注意一下EnumSet和EnumMap都是线程非安全的。
参考资料:
https://www.cnblogs.com/xrq730/p/4890313.html