枚举类的使用
定义一个简单的枚举类,其中包含若干枚举常量,示例如下:
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