美文网首页
Java 枚举(enum)

Java 枚举(enum)

作者: xiaofudeng | 来源:发表于2017-11-09 15:32 被阅读0次

    参考

    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<String, OperatorEnum> 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)

          本文链接:https://www.haomeiwen.com/subject/xynpmxtx.html