优雅地使用枚举enum

在开发中,为了将数据库中存储的数字状态转换为有意义的文本,通常需要编写转换代码。本文介绍了如何使用枚举(enum)来优雅地解决这个问题。通过定义枚举类,可以创建一个getStatus方法,根据状态码获取对应的描述信息。这种方法不仅提高了代码的可读性和可维护性,还便于未来的扩展。文章强调了不断积累和应用设计模式的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发中,我们可能会遇到这样的问题:

某一个对象的某些字段比如常见的xxx的状态,字段名字叫xxxStatus,在数据库中存储的时候存的值一般是数字,

比如:0 未处理 1 已处理  2 已取消

在界面展示的时候,我们不可能直接将数字展示,需要将它的实际含义进行对应展示,以前的自己代码可能会这样写:

           <td>
				<c:choose>
					<c:when test="${bespeakBooking.bookingState==0}">未处理</c:when>
					<c:when test="${bespeakBooking.bookingState==1}">已处理</c:when>
					<c:otherwise>已取消</c:otherwise>
				</c:choose>
			</td>         

其实写这段代码的时候,我们自己可能也知道,很low,如果写了几年代码,水平还是这样子,那么。。。

今天,学会了一种“优雅”的写代码的方式:使用枚举

我们在写后台代码的时候,关于这样子的信息一般会定义一个枚举类:

public enum PayStatusEnum implements CodeEnum{
    WAIT(0,"待支付"),
    FINISHED(1,"已支付"),
    ;


    private Integer code;

    private String msg;

    PayStatusEnum(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

我们返回到前端的一个对象叫做OrderDTO,未做任何处理之前,返回的这个对象中关于状态的存储值就是数字,那么在其中定义一个getStatus的方法,通过此方法获取想要的信息:


<td>${orderDTO.getPayStatusEnum().msg}</td>

orderDTO中代码如下:

public class OrderDTO {
    /** 订单id.*/
    private String orderId;

    //还有其他字段

    /** 支付状态.默认0待支付*/
    private Integer payStatus;

    @JsonIgnore
    public PayStatusEnum getPayStatusEnum(){
        return EnumUtils.getByCode(payStatus,PayStatusEnum.class);
    }

    //还有set/get方法

而这个方法,实质就是根据状态码code去获取msg,那么定义一个接口,这里抽象出来主要是为了单独列出来成为一个公用的方法,因为也许不仅仅只有支付状态,可能还有订单状态,信用状态等等,那么不可能将同样的逻辑代码写在每一个enum类中。

public interface CodeEnum {

    Integer getCode();

}

另外再写一个工具类,目的还是让其称为公用方法,只要是根据code获取msg:

public class EnumUtils {

    public static <T extends CodeEnum> T getByCode(Integer code, Class<T> enumclass){
        for(T each:enumclass.getEnumConstants()){
            if(code.equals(each.getCode())){
                return each;
            }
        }
        return null;
    }
}

这样子的写法,真的非常优雅,并且对今后的扩展非常方便。其实还有许多地方都可以更加优雅的实现,那么需要做的就是不断地积累,并且将这些小技巧(设计模式)灵活应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值