枚举

枚举

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

 

posted @ 2019-01-30 10:53  吹灭读书灯  阅读(448)  评论(0编辑  收藏  举报