Java 枚举类
枚举类的含义
枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。
- 枚举类的常见使用场景
1、定义业务相同的一类属性
2、为同一个业务场景的不同处理方式进行策略处理 - 举例
现在我们有一个扫码支付的场景: 支持支付宝、微信、银联等相关支付渠道
public enum PayEnum {ALI_PAY(1, "alipay"),WX_PAY(2, "wxpay"),UNION_PAY(3, "unionpay");private final Integer type;private final String payChannel;// 以空间换时间,来减少每一次枚举渠道方法调用的时间复杂度private static Map<Integer, PayEnum> payChannelEnums = new ConcurrentHashMap<Integer, PayEnum>(8);PayEnum(Integer type, String payChannel) {this.type = type;this.payChannel = payChannel;}public Integer getType() {return this.type;}public String getPayChannel() {return this.payChannel;}public static PayEnum getPayEnumByType(Integer type) {if (payChannelEnums.isEmpty()) {for (PayEnum each : PayEnum.values()) {payChannelEnums.putIfAbsent(each.getType(), each);}}return payChannelEnums.get(type);}
}
- 枚举类注意事项
1、枚举类的每一个属性都需要定义成常量,防止外部调用时更改相关数值,保证系统的安全性
2、枚举类的每一个实例应基于规约使用全大写的形式例如: ALI_PAY、WX_PAY、UNION_PAY
3、每一个枚举每一个枚举实例都是一个静态常量实例
4、当找不到对应的枚举类是需要抛出 IllegalArgumentException 异常
5、枚举类默认 extends 自 Enum
基于 Hutool EnumUtil 获取枚举相关属性
- 获取枚举类的全部实例属性
EnumUtil.getFieldValues(PayEnum.class, "type"); // [1,2,3]
- 获取枚举类中枚举实例的全部名称
List<String> names = EnumUtil.getNames(PayEnum.class); // ["ALI_PAY", "WX_PAY", "UNION_PAY"]
- 获取枚举字符串 -> Enum 实例的 Map
Map<String,PayEnum> enumMap = EnumUtil.getEnumMap(PayEnum.class); // {{ALI_PAY:ALI_PAY}, {WX_PAY:WX_PAY},{UNION_PAY:UNION_PAY}}
基于枚举类实现策略模式
/**
* 烹饪时常枚举类
*/
public enum CookTimeEnum {NOODLE("面条", 3L) {void cookType() {System.out.println("大火烹饪");}},DUMPLING("饺子", 6L) {void cookType() {System.out.println("中火烹饪");}};/*** 食物名称*/@Getterprivate final String foodName;/*** 烹饪时间*/@Getterprivate final Long cookingTime;CookTimeEnum(String foodName, Long cookingTime) {this.foodName = foodName;this.cookingTime = cookingTime;}/*** 烹饪方式*/abstract void cookType();
}
- 解释
1、每一个枚举类的实例都是一个 class 对象,所以每一个实例都需要重新他的抽象方法-> 以此实现策略模式