枚举类的相关使用
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("中火烹饪");
}
};
/**
* 食物名称
*/
@Getter
private final String foodName;
/**
* 烹饪时间
*/
@Getter
private final Long cookingTime;
CookTimeEnum(String foodName, Long cookingTime) {
this.foodName = foodName;
this.cookingTime = cookingTime;
}
/**
* 烹饪方式
*/
abstract void cookType();
}
- 解释
1、每一个枚举类的实例都是一个 class 对象,所以每一个实例都需要重新他的抽象方法-> 以此实现策略模式