关于项目中太多枚举类

如果你的项目是一个中大型的项目,那么相中一定有很多枚举类。并且在实际场景中,最让人头疼的是找到这些枚举类。因为很多枚举类的名字很相似。比如,状态相关的。

具体,我是这样干的。

基础枚举接口

// enum-common
public interface BaseEnum<T> {
    T getCode();
    String getName();
    String getDescription();
}

// 可序列化的枚举接口
public interface SerializableEnum<T> extends BaseEnum<T>, Serializable {
    // 用于Dubbo序列化
    default String serialize() {
        return String.valueOf(getCode());
    }
    
    // 用于Dubbo反序列化
    static <E extends Enum<E> & SerializableEnum<?>> E deserialize(
            Class<E> enumClass, String value) {
        return EnumUtils.getEnum(enumClass, value);
    }
}

统一枚举定义示例

// enum-common
@Getter
@AllArgsConstructor
public enum OrderStatusEnum implements SerializableEnum<Integer> {
    CREATED(1, "已创建", "订单创建成功"),
    PAID(2, "已支付", "订单支付完成"),
    SHIPPED(3, "已发货", "订单已发货"),
    COMPLETED(4, "已完成", "订单已完成"),
    CANCELLED(5, "已取消", "订单已取消");
    
    private final Integer code;
    private final String name;
    private final String description;
    
    // 用于查找枚举值
    private static final Map<Integer, OrderStatusEnum> CODE_MAP = 
        Arrays.stream(values())
            .collect(Collectors.toMap(OrderStatusEnum::getCode, e -> e));
            
    public static OrderStatusEnum fromCode(Integer code) {
        return CODE_MAP.get(code);
    }
}

这样的话,你的项目中很多的枚举最起码能共用一些东西。但是如何很好的组织它们,让我们在使用查找的时候方便点,这个时候就有两种方式。

  1. 使用不同的包来区分,这样通过包明区分
  2. 使用interface将它们按照业务领域组织在一起,同一个领域的放在一个interface下

例如:

public interface BaseEnums {
    
    /**
     * 通用状态枚举
     */
    @Getter
    @AllArgsConstructor
    enum CommonStatus implements BaseEnum<Integer> {
        VALID(1, "有效"),
        INVALID(0, "无效");
        
        private final Integer code;
        private final String name;
        
        public static CommonStatus of(Integer code) {
            return Arrays.stream(values())
                    .filter(e -> e.getCode().equals(code))
                    .findFirst()
                    .orElse(null);
        }
    }
    
    /**
     * 删除标记枚举
     */
    @Getter
    @AllArgsConstructor
    enum DeleteFlag implements BaseEnum<Integer> {
        NORMAL(0, "正常"),
        DELETED(1, "已删除");
        
        private final Integer code;
        private final String name;
    }
}
posted @ 2025-03-23 22:45  Eular  阅读(36)  评论(0)    收藏  举报