Java 枚举(enum)

参考

Effective Java(2nd Edition)

实例

一直没有怎么关注过Java里的enum枚举类, 原来它的功能不仅仅是public static final int CONSTANT_NAME = 1这样的常量声明.
enum类型中的每个枚举元素, 其实都是该枚举类的一个实例对象, 枚举类的构造器只能是private的. 可以定义新的构造函数, 然后在定义枚举元素的时候传入构造参数, 也可以在enum中定义一些抽象方法, 然后每个枚举元素都可以有自己的行为.
另外, 枚举元素是可以使用==运算符比较的.comparing-java-enum-members-or-equals
下面这个例子主要参考于Effective Java(2nd Edition)这本书.

代码

枚举类:

package enumdemo;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by xiaofu on 17-11-9.
 * 枚举类不可继承其他类, 但是可以实现接口
 */
public enum  OperatorEnum {

    // 以下其实都是OperatorEnum的对象
    ADD("+"){
        @Override
        public double apply(double left, double right) {
            return left + right;
        }
    },
    MINUS("-") {
        @Override
        public double apply(double left, double right) {
            return left - right;
        }
    },
    DIVIDE("/") {
        @Override
        public double apply(double left, double right) {
            return left / right;
        }
    },
    MULTIPLY("*") {
        @Override
        public double apply(double left, double right) {
            return left * right;
        }
    };

    private static final Map CONSTANTS = new HashMap<>();

    static {
        CONSTANTS.put("+", ADD);
        CONSTANTS.put("-", MINUS);
        CONSTANTS.put("/", DIVIDE);
        CONSTANTS.put("*", MULTIPLY);
    }

    private String symbol;

    // enum类型的构造器只能是私有的
    private OperatorEnum(String symbol){
        this.symbol = symbol;
    }

    abstract public double apply(double left, double right);

    @Override
    public String toString() {
        return symbol;
    }

    // 无法定义该方法, 因为编译器会自动生成一个这样的方法
//    public static OperatorEnum valueOf(String representation){
//        return CONSTANTS.get(representation);
//    }

    public static OperatorEnum fromString(String representation){
        return CONSTANTS.get(representation);
    }

}

使用:

package enumdemo;

/**
 * Created by xiaofu on 17-11-9.
 */
public class Main {

    public static void main(String[] args) {
        double a = 10, b = 2;
        for(OperatorEnum operatorEnum: OperatorEnum.values()){
            System.out.println(String.format("%f %s %f = %f", a, operatorEnum, b, operatorEnum.apply(a, b)));
        }
        OperatorEnum multiply = OperatorEnum.fromString("*");
        // 枚举类型可以用 == 比较
        // https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals
        System.out.println(multiply == OperatorEnum.MULTIPLY);
    }

}

输出:

10.000000 + 2.000000 = 12.000000
10.000000 - 2.000000 = 8.000000
10.000000 / 2.000000 = 5.000000
10.000000 * 2.000000 = 20.000000
true

你可能感兴趣的:(Java 枚举(enum))