枚举入门

枚举入门

枚举类型的定义

通过关键字 enum 定义枚举类型数据,数据值一般采用大写。定义位置可以放在类中,类的外部,或者另外的文件中定义。

public class EnumLearn {
    public enum Animal {
        CAT, MOUSE, TIGER, DOG, BIRD;
    }
    Animal cat = Animal.CAT;
}

支持SWITCH操作

public class EnumLearn {
    public enum Animal {
        CAT, MOUSE, TIGER, DOG, BIRD;
    }
    Animal animal = Animal.DOG;
    switch (animal){
        case CAT:
            System.out.println(animal);
            break;
        case MOUSE:
            System.out.println(animal);
            break;
        case TIGER:
            System.out.println(animal);
            break;
        case DOG:
            System.out.println(animal);
            break;
        case BIRD:
            System.out.println(animal);
            break;
    }
}

自定义枚举类

一个枚举类,里面只能存放一个字段,显得太少了。通过自定义枚举类,就能实现多个字段的枚举。

可以通过定制 Enum 类型来定义自己的枚举类。需要注意的是枚举类型的构造函数是私有的 private,所以不能通过 New 来创建枚举类型,正因如此才保证了枚举数据类型的安全,不会被更改。

public class EnumLearn {
    public enum Color{
        RED("红色",1),YELLOW("黄色",2),GREEN("绿色",3);
        private String name;
        private int index;

        Color(String name, int index) {
            this.name = name;
            this.index = index;
        }
        public String getName() {
            return name;
        }

        public int getIndex() {
            return index;
        }
    }

    public static void main(String[] args) {

        //通过第二个字段index来输出
        Color green = Color.GREEN;
        if(green.index==3){
            System.out.println(green);
        }else {
            System.out.println(green.index);
        }

        //通过SWITCH
        Color cor = Color.YELLOW;
        switch (cor){
            case RED:
                System.out.println(cor);
                break;
            case YELLOW:
                System.out.println(cor);
                break;
            case GREEN:
                System.out.println(cor);
                break;
        }

    }
}

//输出结果:
//绿色
//黄色

相关枚举类

处理 enum 枚举类型,还有集合相关的枚举类型数据,如:EnumMap、EnumSet

EnumMap 枚举型映射/字典

相当于 key 是枚举类型的映射。如:

EnumMap<Color,String> enumMap = new EnumMap<>(Color.class);
enumMap.put(Color.RED,"value:red");
//{RED=value:red, YELLOW=value:yellow, GREEN=value:green}
enumMap.put(Color.YELLOW,"value:yellow");
//{RED=value:red, YELLOW=value:yellow, GREEN=value:green}
enumMap.put(Color.GREEN,"value:green");
//{RED=value:red, YELLOW=value:yellow, GREEN=value:green}
for(int i = 0;i < enumMap.size();i++){
    System.out.println(enumMap);
}

EnumSet 枚举集合

EnumSet 是个抽象类,不能实例化,查看源码发现有提供静态实例化 JumboEnumSet 或 RegularEnumSet 对象的方法。这两个对象继承自 EnumSet,区别在于 EnumSet 大小,大于 64 时创建的是 JumboEnumSet 对象,小于 64 时创建的是 RegularEnumSet 对象。源码如下:

    public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        Enum<?>[] universe = getUniverse(elementType);
        if (universe == null)
            throw new ClassCastException(elementType + " not an enum");

        if (universe.length <= 64)
            return new RegularEnumSet<>(elementType, universe);
        else
            return new JumboEnumSet<>(elementType, universe);
    }

使用枚举集合:

EnumSet<Color> corList = EnumSet.noneOf(Color.class);
corList.add(Color.RED);
corList.add(Color.YELLOW);
corList.add(Color.GREEN);
for(Color color : corList){
    System.out.println(color.getIndex()+":"+color.getName());
}
posted @ 2020-09-04 10:01  刺猬鱼/  阅读(171)  评论(0)    收藏  举报