版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LuuvyJune/article/details/90209237
在开发中,我们可能会遇到这样的问题:
某一个对象的某些字段比如常见的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:
扫描二维码关注公众号,回复:
6744087 查看本文章
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;
}
}
这样子的写法,真的非常优雅,并且对今后的扩展非常方便。其实还有许多地方都可以更加优雅的实现,那么需要做的就是不断地积累,并且将这些小技巧(设计模式)灵活应用。