effective java中枚举的几种用法

本文探讨了枚举实例的通用方法使用、枚举的不可变性、特定于常量的方法实现、字符串与枚举之间的映射以及枚举与策略模式的结合运用,展示了如何在Java中高效地组织和管理相关业务逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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);
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值