Java 基础复习 -- Enum 类

在 Java SE5 中添加了一个看似很小的特性,即 enum 关键字,它使得我们在需要群组并使用枚举类型集时,可以很方便的处理。

所有的 enum 都继承自 java.lang.Enum 类。由于 Java 不支持多重继承,所以 enum 不能再继承其他类。然而我们创建一个新的 enum 时,可以同时实现一个或多个接口。

创建一个简单的ColorEnum

public enum ColorEnum {
  RED,YELLOW,BULE,GREED,BLACK;
}

调用的收直接在方法中使用 ColorEnum.RED 即可

ColorEnum red = ColorEnum.RED;

而且 Enum 有一个特别实用的特性,它可以在switch语句内使用:

ColorEnum red = ColorEnum.RED;
// 虽然一般情况下我们必须使用 enum 类型来修饰一个 enum 实例,但是在 case 语句中却不必如此。
switch (red) {
  case RED:
    System.out.println("this's red color");
    break;
  case BULE:
    System.out.println("this's bule color");
    break;
  default:
    System.out.println("this's other color");
}

由于 switch 是要在有限的可能值集合中进行选择,因此它和 enum 是绝佳的组合。一般来说,在 switch 中使用整数值,而枚举实例天生就是具备整数值的次序,并且可以通过 ordinal() 方法取得其次序(现在显然是编译器帮我们做了类似的工作),因此我们可以再 switch 语句中使用 enum。

自定义构造方法枚举类如何定义?

public enum  RedisEnum {
    
    ADD(1, "add"), DEL(2, "delete"), query(3, "query");
    
    private Integer type;
    private String name;

    private RedisEnum(Integer type, String name) {
        this.type = type;
        this.name = name;
    }

    public Integer getType() {
        return type;
    }

    public String getName() {
        return name;
    }
}

枚举类提供的 API

values(); 可以遍历 enum 实例。values()方法返回 enum 实例的数组,而且该数组中的元素严格保持其在 enum 中声明时的顺序,因此可以在循环中使用 values()返回的数组。

valueOf(String key);

ordinal();返回一个 int值,这个是每个 enum 实例在声明时的次序,从 0 开始。

getDeclaringClass();enum 实例上调用这个方法可以获取其所属的 num 类

name();返回 enum 实例声明时的名字,这与使用 toString 方法效果相同

toString();返回 enum 实例声明时的名字

equals(Object obj);enum 重写了 equals 和 hashcode

hashCode();enum 重写了 equals 和 hashcode

二、 使用枚举类型实现策略模式

简单举一个例子

public enum CalculationEnum {
    
    /**
     * 加法运算
     */
    ADD{
        @Override
        public double exec(double num1, double num2) {
            return num1 + num2;
        }
    },
    /**
     * 减法运算
     */
    SUB{
        @Override
        public double exec(double num1, double num2) {
            return num1 - num2;
        }
    };

    public abstract double exec(double num1, double num2);

    public static void main(String[] args) {

        double addNum = CalculationEnum.ADD.exec(1, 2.2);
        System.out.println(addNum);
        double subNum = CalculationEnum.SUB.exec(3.2, 1.1);
        System.out.println(subNum);

    }

}