优雅地使用枚举enum

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
}

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

猜你喜欢

转载自blog.csdn.net/LuuvyJune/article/details/90209237