java基础-enum 枚举

时间:2022-10-05 19:22:12

Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。枚举类型的定义也非常的简单,用 enum 关键字加上名称和大括号包含起来的枚举值体即可,例如上面提到的彩虹颜色就可以用新的 enum 方式来重新定义:

enum RainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }

从上面的定义形式来看,似乎 Java 中的枚举类型很简单,但实际上 Java 语言规范赋予枚举类型的功能非常的强大,它不仅是简单地将整形数值转换成对象,而是将枚举类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给枚举类型增加任何方法和属性,也可以实现任意的接口。

enum扩大了 switch 语句使用范围。5.0 之前,Java 中 switch 的值只能够是简单类型,比如 int、long、char, 有了枚举类型之后,就可以使用对象了。这样一来,程序的控制选择就变得更加的方便,看下面的例子:

java基础-enum 枚举
// 定义一周七天的枚举类型                          
public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }

// 读取当天的信息
WeekDayEnum today = readToday();

// 根据日期来选择进行活动
switch(today) {
Mon:
do something; break;
Tue:
do something; break;
Wed:
do something; break;
Thu:
do something; break;
Fri:
do something; break;
Sat: play sports game;
break;
Sun: have a rest;
break;
}
java基础-enum 枚举

 


对于这些枚举的日期,JVM 都会在运行期构造成出一个简单的对象实例一一对应。这些对象都有唯一的 identity,类似整形数值一样,switch 语句就根据此来进行执行跳转。

除了最常见的枚举定义形式外,如果需要给枚举类型增加一些复杂功能,也可以通过类似 class 的定义来给枚举进行定制。比如要给 enum 类型增加属性、添加构造方法或抽象方法,

java基础-enum 枚举
package heima;



public class EnumTest {

public static void main(String[] args) {

TrafficLamp ww
= TrafficLamp.RED;

System.out.println(ww);
//枚举自动实现了toString方法

System.out.println(ww.time);
//红灯时长

System.out.println(ww.nextLamp());
//下一个等的颜色



}



public enum TrafficLamp {//枚举也是一个类,可以有子类,也有默认构造方法



RED(
30){// 调用父类的有参的构造方法创建一个子类的实例,由匿名内部类创建子类,,并构建新的方法

public TrafficLamp nextLamp() {//重写父类的抽象方法,

return GREEN;

};



},

GREEN(
30){

public TrafficLamp nextLamp() {

return YELLOW;

};





}, YELLOW(
5){

public TrafficLamp nextLamp() {

return RED;

};





};

private int time;

private TrafficLamp(int time){//定义有参的构造方法,增加参数时间

this.time= time;

}



public abstract TrafficLamp nextLamp() ;





}



}
java基础-enum 枚举

 

 

 

不过在使用 Enum 时候有几个地方需要注意:

  1. enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
  2. 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。
  3. 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。