用二进制来替换项目中排列组合的类型

项目中一般会有支付方式的组合。比如:用户购买一件商品可以用“积分,优惠券,金币,在线付款”任意方式组合付款。对于支付类型有四种单项,相互任意组合一共有十四种,那就是需要十四种枚举才能表示完四种的排列组合。如果新增一种支付方式,那么枚举又会快速扩张,对项目维护起来难度挺大。
如果用二进制形式来表示,新增或减少,查询都是很方便的。
积分用1,优惠券用2,金币用4,在线支付用8。
比如用户用“积分+优惠券+在线支付”付款,那么他的支付类型就是“1+2+8=11”。
比如用户用“在线支付”付款,那么他的支付类型就是”8”。
如果在新增一个支付类型,只需新增一个枚举,支付类型可自动扩展 。
如下是项目用到的枚举类型

package com.evan.javaConcurrentTwo;

public enum PayTypeEnum {
    INTEGRAL("积分"),
    COUPON("优惠券"),
    GOLD("金币"),
    ONLINE("在线支付");

    private int binaryCode;
    private String name;
    PayTypeEnum(String name){
        //jdk自带的方法ordinal()从0开始逐渐加1的方法.
        this.binaryCode = 1 << ordinal();
        this.name = name;
    }

    public int getBinaryCode() {
        return binaryCode;
    }

    public String getName() {
        return name;
    }
}
如果按照现在这种存入数据库后,想查询“包含在线支付的订单”直接用如下sql就能很方便。而不用in条件

select * from order where order_type & 8 = 8

二进制的优点:新增类型不会造成类型爆炸性增长
二进制的适用场景:多个类型相互之间组合

二进制有三种操作符规则
1. 按位与(&) 全为1取1,不同取0.比如 11 & 8 = 8 (可以用来判断时候包含这种支付类型)
2. 按位或(|) 全为0取0,不同取1。比如11 | 8 = 11
3. 异或运算(^) 相同为0 不同取1 比如 11^8 = 3 (可以做支付状态剔除)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值