关于项目中太多枚举类
如果你的项目是一个中大型的项目,那么相中一定有很多枚举类。并且在实际场景中,最让人头疼的是找到这些枚举类。因为很多枚举类的名字很相似。比如,状态相关的。
具体,我是这样干的。
基础枚举接口
// 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
@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;
}
}
本文来自博客园,作者:Eular,转载请注明原文链接:https://www.cnblogs.com/euler-blog/p/18788462
浙公网安备 33010602011771号