【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() 。