【Java SE】十五、枚举类
Java 枚举是一个特殊的类,一般表示一组有限且确定的常量,如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天等。
Java 枚举类使用 enum
关键字来定义,各个常量使用逗号来分割。
enum Color { RED, GREEN, BLUE;}
基本操作
每个枚举都是通过 Class 在内部实现的,且所有的枚举值都是 public static final
的,所以本质还是类,可以像类一样使用,如下:
enum Season {
// 定义常量元素
// private static final Season SPRING = Season("green"); 无枚举类时的原本写法,用枚举类后可省略为以下写法
SPRING("green"), // 若无参,则可以省略括号,如:SPRING,
SUMMER("yellow"),
AUTUMN("orange"),
WINTER("white");
private final String seasonColor; // 定义属性
private Season(String seasonColor) { // 构造器
this.seasonColor = seasonColor;
}
public String getSeasonColor() { // 方法
return seasonColor;
}
/* @Override 还可以重写该方法
public String toString() {
return "它是" + this.seasonColor + "的";
} */
}
public class Test {
public static void main(String[] args) {
Season spring = Season.SPRING; // 其实有时候不需要创建引用,而是直接调用
Season autumn = Season.valueOf("AUTUMN"); // 该方法由于获取指定的常量元素,没有则报错
Season[] values = Season.values(); // 该方法用于获取枚举类所有的常量元素
System.out.println(spring); // SPRING
System.out.println(autumn); // AUTUMN
System.out.println(Season.SUMMER); // SUMMER
System.out.println(spring.getSeasonColor()); // green
for (Season each : values) {
System.out.println(each + " " + each.getSeasonColor());
}
System.out.println(Season.WINTER.toString());
}
}
运行结果如下:
SPRING
AUTUMN
SUMMER
green
SPRING green
SUMMER yellow
AUTUMN orange
WINTER white
WINTER
实现接口
假如有以下一个接口需要用上文所创建的枚举类去实现
interface printshit { void show();} // 只有一个待实现方法
我们可以分为两种方式去实现:
enum Season implements printshit{
// 方式二,分别实现(匿名方式)
SPRING {
@Override
public void show() {
System.out.println("fuck me");
}
},
SUMMER {
@Override
public void show() {
System.out.println("fuck fuck me");
}
},
AUTUMN {
@Override
public void show() {
System.out.println("fuck fuck fuck me");
}
},
WINTER {
@Override
public void show() {
System.out.println("fuck fuck fuck fuck me");
}
};
/*// 方式一,统一实现
@Override
public void show() {
System.out.println("fuck you");
}*/
}
显而易见,方式一所有常量元素的 show()
方法都只会输出 fuck you
;而方式二则各不相同。
其他方法
除了 values()
,valueOf()
,toString()
这三个常用方法,Enum 类还提供了以下几个主要方法:
方法名 | 说明 |
---|---|
equals | 在枚举类型中可以直接使用 “" 来比较两个枚举常量是否相等。Enum 提供的这个 equals 方法,也是用 ““ 实现的。它的存在是为了在 Set 、List 和 Map 中使用。注意,equals() 是不可变的 。 |
hashCode | 返回哈希值,用来和 equals() 保持一致。 它也是不可变的。 |
getDeclaringClass | 得到枚举常量所属枚举类型的 Class 对象。可以用它来判断两个枚举常量是否属于同一个枚举类型。 |
name | 得到当前枚举常量的名称。建议优先使用 toString() 。 |
ordinal | 得到当前枚举常量的次序。 |
compareTo | 枚举类型实现了 Comparable 接口,这样可以比较两个枚举常量的大小(按照声明的顺序排列) |
clone | 枚举类型不能被 Clone。为了防止子类实现克隆方法,Enum 实现了一个仅抛出异常的不变 Clone() 。 |