effective java中枚举的几种用法

来源:互联网 发布:淘宝客服的感想 编辑:程序博客网 时间:2024/06/03 06:43

构造器和枚举实例通用方法的使用:

public enum Planet {    PLANET1 (1,2),    PLANET2 (2,3),    PLANET3 (3,4);    private final int mass;    private final int radius;    private final int surfaceWeight;    Planet(int mass, int radius) {        this.mass = mass;        this.radius = radius;        this.surfaceWeight = mass * radius;    }    public double getSurfaceWeight() {        return surfaceWeight;    }}
枚举天生不可变,因此所有域都必须为final,而java中final域若在申明时不初始化,则必须在构造器中初始化。因此构造器中必须对所有域初始化,否则编译器将报错。

所有枚举都有一个静态的values方法按照声明顺序返回它的值数组。


若枚举中的每个实体都需要与一种特定的行为相关联,则可以在枚举类型中声明一个抽象的apply方法,这种方法被称作特定于常量的方法实现(constant-specific method implementation) :

public enum Operation {    PLUS {        double apply(double x, double y) {            return x + y;        }    },    MINUS {        double apply(double x, double y) {            return x - y;        }    };    abstract double apply(double x, double y);}


当需要使用字符串常量获取枚举常量时,使用一个static的map变量存储字符串常量与枚举对象的关系:

    //实现fromString方法    private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>();    static {        for (Operation op : values()) {            stringToEnum.put(op.toString(), op);        }    }    public static Operation fromString(String symbol) {        return stringToEnum.get(symbol);    }


枚举可以和策略模式很好地配合,使用一个枚举类表示一个策略集合,每个枚举实例代表一个具体策略:

public enum PayType {    //枚举数据的定义必须放在最上端    WEEKDAY{        double overtimePay(double hrs, double payRate){            return hrs < HOURS_PER_SHIFT ? 0 : (hrs - HOURS_PER_SHIFT) * payRate/2;        }    },    WEEKEND{        double overtimePay(double hrs,double payRate){            return hrs * payRate / 2;        }    };    private static final int HOURS_PER_SHIFT = 8;    abstract double overtimePay(double hrs, double payRate);    double pay(double hoursWorked, double payRate) {        double basePay = hoursWorked * payRate;        return basePay + overtimePay(hoursWorked, payRate);    }}

PayType为策略类,其中WEEKDAY和WEEKEND为两种具体策略,特定于常量的方法和通用方法的结合使用

public enum PayrollDay {    MONDAY(PayType.WEEKDAY),    TUESDAY(PayType.WEEKDAY),    WEDNESDAY(PayType.WEEKDAY),    THURSDAY(PayType.WEEKDAY),    FRIDAY(PayType.WEEKDAY),    SATURDAY(PayType.WEEKEND),    SUNDAY(PayType.WEEKEND);    private final PayType paytype;    PayrollDay(PayType payType) {        this.paytype = payType;    }    double pay(double workedHours, double payRate) {        return paytype.pay(workedHours, payRate);    }}




原创粉丝点击