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和"+"关联起来了。

  • 相关阅读:
    第10组 Alpha冲刺(4/4)
    python2中的新式类与经典类区别
    http请求Content-Type有几种
    2020 年软件设计师考试大纲
    11-Elasticsearch之-组合查询
    16-扩展阅读-摘录
    各种排序算法
    Vmware虚拟机三种网络模式详解(转载)
    无法访问 CentOS7服务器上应用监听的端口
    VsCode 常用插件清单
  • 原文地址:https://www.cnblogs.com/wangjiyuan/p/effectivejava1.html
Copyright © 2011-2022 走看看