1 概念

1.1 定义

全称为 enumeration, 是 JDK 1.5 中引入的新特性。关键词enum

  1. enum ClassName { Item1, Item2, ... }

如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。以ClassName为例,枚举常量依次为:Item1:0,Item2:1,Item3:2

1.2 优点

将常量组织起来统一管理。

1.3 使用场景

枚举的典型应用场景:错误码、状态机等。
样例:状态机

  1. enum Signal {RED, YELLOW, GREEN}
  2. public static String getTrafficInstruct(Signal signal) {
  3. String instruct = "信号灯故障";
  4. switch (signal) {
  5. case RED:
  6. instruct = "红灯停";
  7. break;
  8. case YELLOW:
  9. instruct = "黄灯请注意";
  10. break;
  11. case GREEN:
  12. instruct = "绿灯行";
  13. break;
  14. default:
  15. break;
  16. }
  17. return instruct;
  18. }

1.4 本质

尽管 enum 看起来像是一种新的数据类型,事实上,enum是一种受限制的类,并且具有自己的方法。创建enum时,编译器会为你生成一个相关的类,这个类继承自 java.lang.Enum

2 相关方法

枚举声明的格式

  1. enum Color { RED, GREEN, BLUE }
  2. enum Color { RED, GREEN, BLUE, }
  3. enum Color { RED, GREEN, BLUE; }

2.1 enum提供的基础方法

  1. values();//返回enum实例的数组,而且该数组中的元素严格保持在enum中声明时的顺序。
  2. name();//返回实例名。
  3. ordinal();//返回实例声明时的次序,从0开始。
  4. getDeclaringClass();//返回实例所属的 enum 类型。
  5. equals();//判断是否为同一个对象,允许使用==来比较enum对象
  6. hashCode();//获取枚举实例的hash码

2.2 enum中常量赋值方法

Java与C++不同,不能使用**==**符号直接为常量赋值。创建 enum 时,可以为其添加多种方法,甚至可以为其添加构造方法。为 enum 添加方法来间接实现显示赋值
注意:如果要为enum定义方法,那么必须在enum的最后一个实例尾部添加一个分号。此外,在enum中,必须先定义实例,不能将字段或方法定义在实例前面。否则,编译器会报错。
样例:错误码实现

  1. public enum ErrorCodeEn {
  2. OK(0, "成功"),
  3. ERROR_A(100, "错误A"),
  4. ERROR_B(200, "错误B");
  5. ErrorCodeEn(int number, String description) {
  6. this.code = number;
  7. this.description = description;
  8. }
  9. private int code;
  10. private String description;
  11. public int getCode() {
  12. return code;
  13. }
  14. public String getDescription() {
  15. return description;
  16. }
  17. public static void main(String args[]) { // 静态方法
  18. for (ErrorCodeEn s : ErrorCodeEn.values()) {
  19. System.out.println("code: " + s.getCode() + ", description: " + s.getDescription());
  20. }
  21. }
  22. }

2.3 实现接口

枚举可以像正常类一样实现接口
样例:实现接口的错误码

  1. public interface INumberEnum {
  2. int getCode();
  3. String getDescription();
  4. }
  5. public enum ErrorCodeEn2 implements INumberEnum {
  6. OK(0, "成功"),
  7. ERROR_A(100, "错误A"),
  8. ERROR_B(200, "错误B");
  9. ErrorCodeEn2(int number, String description) {
  10. this.code = number;
  11. this.description = description;
  12. }
  13. private int code;
  14. private String description;
  15. @Override
  16. public int getCode() {
  17. return code;
  18. }
  19. @Override
  20. public String getDescription() {
  21. return description;
  22. }
  23. }

3 特性

3.1 继承

枚举不可以继承另一个类,当然,也不能继承另一个 enum。除了不能继承,基本上可以将 enum 看做一个常规的类。
原因:因为 enum 实际上都继承自 java.lang.Enum 类,而 Java 不支持多重继承,所以 enum 不能再继承其他类,当然也不能继承另一个 enum

4 工具类

4.1 EnumSet

4.2 EnumMap