枚举最佳实践

前言

我们在原来是使用枚举的时候,前后约定一个固定编码状态,如果后续状态码发生改变,前后端都会去改动。我们在想是否能通过一种方式,就交由后端维护一条编码减少维护难度。

实践

我们主要是想通过一个接口的方式将所有我们需要告知前端枚举全部返回,这篇博客主要是通过这种方案将这种方式将这个数据能够简单返回。

1、这里先贴出需要返回对象

@Data
@AllArgsConstructor
public class EnumResponse {
    /**
     * 枚举id(可以使字符串类型,也有可能是数值类型)
     */
    private Serializable enumId;
    /**
     * 枚举名
     */
    private String enumName;

    /**
     * 枚举描述
     */
    private String enumDescription;

}

2、定义一下需要返回给前端的枚举

@Getter
@AllArgsConstructor
public enum  OrderTypeEnum {
    /**
     * 公司下单
     */
    COMPANY(0, "公司下单"),
    /**
     * 个人下单
     */
    PERSONAL(1, "个人下单"),


    /**
     * 未知错误
     */
    UNKNOWN(Integer.MAX_VALUE, "-");

    private final int code;

    private final String value;

    public static OrderTypeEnum of(int code) {
        for (OrderTypeEnum value : values()) {
            if (value.code == code) {
                return value;
            }
        }
        return UNKNOWN;
    }
}

@Getter
@AllArgsConstructor
public enum OrderSateEnum {
    /**
     * 30 分钟未支付
     */
    EXPIRE(-1, "过期"),
    /**
     * 完成下单
     */
    UN_PAY(0, "已下单"),
    /**
     * 完成支付
     */
    PAY_COMPLETE(1, "支付完成"),
    /**
     * 已经发货
     */
    DELIVER(2, "已经发货"),

    /**
     * 未知错误
     */
    UNKNOWN(Integer.MAX_VALUE, "-");
    private final int code;

    private final String value;

    public static OrderSateEnum of(int code) {
        for (OrderSateEnum value : values()) {
            if (value.code == code) {
                return value;
            }
        }
        return UNKNOWN;
    }
}

3、定义管理返回前端枚举类

public enum AdminEnum {
    /**
     * 订单状态
     */
    ORDER_STATE {
        @Override
        public List<EnumResponse> toEnumResponse() {
            return Arrays.stream(OrderSateEnum.values()).filter(sateEnum -> sateEnum != OrderSateEnum.UNKNOWN)
                    .map(sateEnum -> new EnumResponse(sateEnum.getCode(),sateEnum.name(),sateEnum.getValue()))
                    .collect(Collectors.toList());
        }
    },

    /**
     * 订单类型
     */
    ORDER_TYPE {
        @Override
        public List<EnumResponse> toEnumResponse() {
            return Arrays.stream(OrderTypeEnum.values()).filter(typeEnum -> typeEnum != OrderTypeEnum.UNKNOWN)
                    .map(typeEnum -> new EnumResponse(typeEnum.getCode(), typeEnum.name(), typeEnum.getValue()))
                    .collect(Collectors.toList());
        }
    };

    public abstract List<EnumResponse> toEnumResponse();
}

4、定义返回前端接口

 @GetMapping("/enums")
    public Map<AdminEnum,List<EnumResponse>> listEnum(){
        return Arrays.stream(AdminEnum.values()).collect(Collectors.toMap(item -> item, AdminEnum::toEnumResponse));
    }

查看接口返回效果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值