使用二进制的方式存储多条件的业务

在业务开发中,有的时候会碰到这样的需求,一个对象要生效,会有各种各样的条件,而这些条件又只有之分,如果我们每个条件都用一个字段的话,那么数据库保存的时候需要对应给每个条件都加一个字段,这样也不是不可以,一般这种也是比较常见的做法,但是如果比较多,但是又有拓展的可能,那么是否可以考虑另一种方式来存储,也值得考虑。

本文介绍一种基于二进制的方式来存储这些条件,通过简单的java代码实现主要的逻辑。

开始

假如业务是支持的支付方式,比如有微信、支付宝、美团支付、抖音支付(听说要出了)、招商银行卡;

创建一个枚举:

public enum PayWayEnum {

    /**
     * 微信
     */
    TENCENT(0),
    /**
     * 支付宝
     */
    ALIPAY(1),

    /**
     * 抖音
     */
    BYTE_DANCE(2),

    /**
     * 美团
     */
    MEITUAN(3),

    /**
     * 招商银行
     */
    CMB(4),
    ;

    /**
     * 对应数据库存储的二进制位数
     */
    private int bit;

    PayWayEnum(int bit) {
        this.bit = bit;
    }

    public int getBit() {
        return bit;
    }

}

从业务的角度来讲,不外乎对这个字段的增改查

工具类

@UtilityClass
public class BinaryUtil {

    /**
     * 验证二进制第bit位的结果
     *
     * @param binary 二进制值
     * @param bit    index 从0开始
     * @return true 为1 false 为0
     */
    public static boolean match(Integer binary, int bit) {
        int value = 1 << (bit);
        int i = value & binary;
        return i > 0;
    }

    /**
     *
     * 将二进制result的第bit位设置为bool的值
     * 一般用于修改
     * @param binary 二进制原始值
     * @param bit    index 从0开始
     * @param bool   要设置的值
     * @return 修改后的结果
     */
    public static Integer set(Integer binary, int bit, boolean bool) {
        if (bool) {
            int value = 1 << bit;
            return binary | value;
        } else {
            int value = ~(1 << bit);
            return binary & value;
        }
    }

    /**
     * 指定几位生产二进制
     * 用户创建
     * @param bits  设置某几位为1
     * @return 范围生成的二进制值
     */
    public static Integer accept(int[] bits) {
        int binary = 0;
        for (int bit : bits) {
            binary = set(binary, bit, true);
        }
        return binary;
    }

    /**
     * 字符串二进制1010101转为整数值
     *
     * @param binaryString
     * @return
     */
    public static Integer valueOf(String binaryString) {
        return Integer.valueOf(binaryString, 2);
    }

    /**
     * 将数字转为二进制字符串
     *
     * @param integer
     * @return
     */
    public static String toBinaryString(Integer integer) {
        return Integer.toBinaryString(integer);
    }
}

测试

    public static void main(String[] args) {

        // 初始化
        Integer accept = accept(new int[]{PayWayEnum.TENCENT.getBit(), PayWayEnum.ALIPAY.getBit()});
        System.out.println(toBinaryString(accept));

        // 验证是否支持微信支付
        String value = toBinaryString(accept);
        Integer integer = valueOf(value);
        boolean match = match(integer, PayWayEnum.TENCENT.getBit());
        System.out.println(match);

        // 设置支持美团支付
        Integer result = set(integer, PayWayEnum.MEITUAN.getBit(), true);
        System.out.println(result);
        String s = Integer.toBinaryString(result);
        System.out.println(s);
    }

思考

使用二进制的方式存储类似的这种业务数据,扩展性比较强,比如我需要再增加一个建行支付,直接增加一个枚举即可(如果将枚举改成字典那就更好了); 但是也有不好的地方,比如数据库值可读性不高,不方便使用sql批量更新数据,因为每个的值都会有不同,比如我某天增加了一个支付方式,我希望所有的商品都支持这种支付方式,这个时候其实就需要精细化更新了。

总的来说这是一种思考的方向,具体还是要根据实际开发中的需要来使用不同的数据结构,没有万能药。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容