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

  • 相关阅读:
    Hibernate入门
    oracle数据库应用(2)
    oracle数据库应用
    Oracle数据库基础
    InitBinder 在Controller方法执行之前进行捕获请求,进行类型的转换
    Spring面试题
    Object处理方法的返回值
    使用jQuery快速高效制作网页交互特效
    struts2
    表分区
  • 原文地址:https://www.cnblogs.com/wangjiyuan/p/effectivejava1.html
Copyright © 2011-2022 走看看