枚举类的使用

定义一个简单的枚举类,其中包含若干枚举常量,示例如下:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY
}

Java 的 switch 语句参数支持使用枚举类

// day是Day类型变量
switch (day) {
    case MONDAY:
        System.out.println("要开组会了好难受");
        break;
    case THURSDAY:
        System.out.println("肯德基疯狂星期四");
        break;
    case SATURDAY: case SUNDAY:
        System.out.println("不浪对不起周末");
        break;
    default:
        System.out.println("摸摸鱼");
        break;
}

其实这个用 static final 也可以,但是用枚举类的好处在于:

  • static final 的话,传入的变量就需要进行参数检查,而枚举类不用,因为肯定在枚举的范围中,或为 null
  • static final 不支持属性扩展,每个变量名对应一个值,而每一个枚举值可以拥有自己的多个属性(字段)

枚举类可以添加属性及相应的构造器,以及方法,不过枚举类中的构造器默认也必须是 private。示例如下:

public enum Day {
    MONDAY(1, "星期一"),
    TUESDAY(2, "星期二"),
    // ......
    SUNDAY(7, "星期日");

    private int index;
    private String name;

    Day(int index, String name) {
        this.index = index;
        this.name = name;
    }

    // 针对index、name的getter方法
    // ......
}

枚举类中的每个枚举常量都可以实现枚举主类定义的(abstract)方法,也可以拥有各自的内部方法,如下:

public enum Day {
    MONDAY(1, "星期一"){
        @Override
        public Day getNext() {
            return TUESDAY;
        }
    },
    TUESDAY(2, "星期二"){
        @Override
        public Day getNext() {
            return WEDNESDAY;
        }
    },
    // ......
    SUNDAY(7, "星期日"){
        @Override
        public Day getNext() {
            return MONDAY;
        }
    };

    private int index;
    private String name;

    Day(int index, String name) {
        this.index = index;
        this.name = name;
    }

    // 在主类中定义抽象方法
    public abstract Day getNext();

    // 针对index、name的getter方法
    // ......
}

虽然也可以在每个枚举常量中自定义任何方法,但是如果没有在主类中声明,就不能访问到,这个暂且按下不表,原因在后面会解释

所有枚举类都默认继承了 Enum,可以直接使用 Enum 提供的实用方法。由于 Java 只支持单继承,所以枚举类不能再继承别的父类,只能实现接口。一些使用的 Enum 类的方法,都贴在了文末

枚举类的枚举常量全局唯一,不存在并发安全性问题,且不会被反射、序列化方式恶意创建新的枚举常量对象,很适合用来实现单例模式。这里可以参加博主的另一篇文章:单例模式的各种实现方式(Java)

最后再补充一点,博主发现某书和很多博客都说:在比较两个枚举类型的值时 , 永远不需要调用 equals 方法, 而直接使用 == 就可以了。但是我看了下 Enum 类中给到的 equals 源码(贴在下面),实际上用的也是 ==,我自己手动测试了也没问题。但不知道为什么,大家的博客上都这么写的,难道真就是人云亦云吗-_-||

public final boolean equals(Object other) {
    return this==other;
}
作者:酒冽        出处:https://www.cnblogs.com/frankiedyz/p/15851123.html
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
01-28 10:53