小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
上边的文章我们已经对枚举类的使用有了充分的了解,本文我们就从实际需求出发,简单实现一个订单状态转换限制的小案例,供大家参考!
需求
订单是电商项目中不可缺少的组成部分,而订单状态的转换也是我们经常讨论的问题。我们都知道订单状态的转换是有一定的逻辑性的,不可以随意转换。
例:你想购买某个商品,只是把它加入了购物车,此时应该是未支付状态。如果来个请求想把它转换为退款状态,那么系统应该抛出提示信息“状态转换失败,请先完成购买!”
接下来我们就用枚举来完成一下订单状态转换的限制。
实现
枚举类定义:
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可以加入技术交流群参与讨论呦!