语法糖甜不甜?巧用枚举实现“状态”转换限制(四)

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

上边的文章我们已经对枚举类的使用有了充分的了解,本文我们就从实际需求出发,简单实现一个订单状态转换限制的小案例,供大家参考!

需求

订单是电商项目中不可缺少的组成部分,而订单状态的转换也是我们经常讨论的问题。我们都知道订单状态的转换是有一定的逻辑性的,不可以随意转换。

:你想购买某个商品,只是把它加入了购物车,此时应该是未支付状态。如果来个请求想把它转换为退款状态,那么系统应该抛出提示信息“状态转换失败,请先完成购买!”

接下来我们就用枚举来完成一下订单状态转换的限制。

实现

枚举类定义:

public enum OrderStatus{
    NO_PAY("未支付",0){
        @Override
        public Boolean canChange(OrderStatus orderStatus) {
            switch (orderStatus){
                case PAY:
                    return true;
                default:
                    return false;
            }
        }
    },
    PAY("已支付",1){
        @Override
        public Boolean canChange(OrderStatus orderStatus) {
            //因为退款接口一般都会有延迟,所以会先转化为“退款中”状态
            switch (orderStatus){
                case REFUNDING:
                    return true;
                default:
                    return false;
            }
        }
    },
    REFUNDING("退款中",2){
        @Override
        public Boolean canChange(OrderStatus orderStatus) {
            switch (orderStatus){
                case REFUNDED:
                case FAIL_REFUNDED:
                    return true;
                default:
                    return false;
            }
        }
    },
    REFUNDED("退款成功",3),
    FAIL_REFUNDED("退款失败",4),
    ;

    private final String name;
    private final int status;

    private OrderStatus(String name,int status){
        this.name = name;
        this.status = status;
    }

    //自定义转换方法
    public Boolean canChange(OrderStatus orderStatus){
        return false;
    }
}
复制代码

调用方法:

public class EnumTest {

    public static void main(String[] args) {
        Boolean aBoolean = OrderStatus.NO_PAY.canChange(OrderStatus.PAY);
        String statusStr = aBoolean?"可以":"不可以";
        System.out.println("是否可以完成状态转换:"+ statusStr);

        Boolean flag = OrderStatus.REFUNDED.canChange(OrderStatus.FAIL_REFUNDED);
        String flagStr = flag?"可以":"不可以";
        System.out.println("是否可以完成状态转换:"+ flagStr);
    }
}
复制代码

返回结果:

这样我们就用枚举类实现了订单状态转换的限制。此例子只是为状态转换提供一种思路,具体的流程还需要根据自己系统中的业务来具体处理。

如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!

猜你喜欢

转载自juejin.im/post/7016862848525533214