枚举类的相关使用

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 对象,所以每一个实例都需要重新他的抽象方法-> 以此实现策略模式

posted @ 2024-05-11 14:08  ayiZzzz  阅读(13)  评论(0编辑  收藏  举报