zoukankan      html  css  js  c++  java
  • Java提供的enum详解

    今天第一天看<<Effective Java>>,看了第六章的第一条就是全书的第30条--用enum代替int常量。

    1.第一次知道原来enum也可以像class那样拥有成员函数。举个四则运算的例子:

    package com.wjy.test;
    
    public enum Operation {
        PLUS,MINUS,TIMES,DIVIDE;
        double apply(double x,double y){
            switch(this){
            case PLUS:    return x+y;
            case MINUS:    return x-y;
            case TIMES:    return x*y;
            case DIVIDE: return x/y;
            }
            throw new AssertionError("Unknown op: "+this);
        }
    }

    调用代码:

    package com.wjy.test;
    public class Test {
        public static void main(String args[]){
        System.out.println(Operation.PLUS.apply(1.0,2.2));
        }
    }

    但是上述方式有一个问题,就是不利于扩展。若添加一个新的枚举常量还要更改switch添加一条语句,所以这种模式是很脆弱的。

    有一种好的模式可以将不同的行为与每个枚举常量关联起来。

    2.将不同的行为与每个枚举常量关联的办法:

    package com.wjy.test;
    
    public enum Operation {
        PLUS{    double apply(double x,double y){return x+y;}    },
        MINUS{    double apply(double x,double y){return x-y;}    },
        TIMES{    double apply(double x,double y){return x*y;}    },
        DIVIDE{    double apply(double x,double y){return x/y;}    };
        
        abstract double apply(double x,double y);
        }

    调用代码

    package com.wjy.test;
    public class Test {
        public static void main(String args[]){
        System.out.println(Operation.PLUS);
        System.out.println(Operation.PLUS.apply(1.0,2.2));
        }
    }

    运行结果:

    //结果
    PLUS
    3.2

    问题又出现了,为什么输出的是"PLUS"而不是”+“,为了让他输出"+",应该覆盖toString方法。

    3.重载toString()

    package com.wjy.test;
    
    public enum Operation {
        PLUS("+"){    double apply(double x,double y){return x+y;}    },
        MINUS("-"){    double apply(double x,double y){return x-y;}    },
        TIMES("*"){    double apply(double x,double y){return x*y;}    },
        DIVIDE("/"){    double apply(double x,double y){return x/y;}    };
        
        private final String symbol;
        Operation(String symbol) {
        this.symbol=symbol;
        }
        @Override 
        public String toString(){
            return symbol;
        }
        abstract double apply(double x,double y);
        }

    则Option.PLUS和"+"关联起来了。

  • 相关阅读:
    Online ddl 工具之pt-online-schema-change
    【MySql】mysql 慢日志查询工具之mysqldumpslow
    赶集网mysql开发36条军规
    MySQL数据库高并发优化配置
    mysql的表分区
    mysql 如果处理货币金钱类型
    bootstrab table+表格 select可编辑完整实例
    mongoDb 给表添加+ 删除字段
    mongoDb +Java+springboot
    java+数据库+D3.js 实时查询人物关系图
  • 原文地址:https://www.cnblogs.com/wangjiyuan/p/effectivejava1.html
Copyright © 2011-2022 走看看