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

  • 相关阅读:
    [CareerCup] 11.6 Search a 2D Matrix 搜索一个二维矩阵
    [CareerCup] 11.5 Search Array with Empty Strings 搜索含有空字符串的数组
    [CareerCup] 11.4 Sort the File 文件排序
    [CareerCup] 11.3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索
    VTK 6.3.0 Qt 5.4 MinGW 4.9.1 Configuration 配置
    [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
    [CareerCup] 11.1 Merge Arrays 合并数组
    Matlab Delete Row or Col 删除矩阵的行或列
    [CareerCup] 10.7 Simplified Search Engine 简单的搜索引擎
    [LeetCode] Nim Game 尼姆游戏
  • 原文地址:https://www.cnblogs.com/wangjiyuan/p/effectivejava1.html
Copyright © 2020-2023  润新知