如果你的项目是一个中大型的项目,那么相中一定有很多枚举类。并且在实际场景中,最让人头疼的是找到这些枚举类。因为很多枚举类的名字很相似。比如,状态相关的。
具体,我是这样干的。
基础枚举接口
// 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);}
}
这样的话,你的项目中很多的枚举最起码能共用一些东西。但是如何很好的组织它们,让我们在使用查找的时候方便点,这个时候就有两种方式。
- 使用不同的包来区分,这样通过包明区分
- 使用interface将它们按照业务领域组织在一起,同一个领域的放在一个interface下
例如:
public interface BaseEnums {/*** 通用状态枚举*/@Getter@AllArgsConstructorenum 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@AllArgsConstructorenum DeleteFlag implements BaseEnum<Integer> {NORMAL(0, "正常"),DELETED(1, "已删除");private final Integer code;private final String name;}
}