在业务开发中,有的时候会碰到这样的需求,一个对象要生效,会有各种各样的条件,而这些条件又只有
是
与否
之分,如果我们每个条件都用一个字段的话,那么数据库保存的时候需要对应给每个条件都加一个字段,这样也不是不可以,一般这种也是比较常见的做法,但是如果比较多,但是又有拓展的可能,那么是否可以考虑另一种方式来存储,也值得考虑。
本文介绍一种基于二进制的方式来存储这些条件,通过简单的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批量更新数据,因为每个的值都会有不同,比如我某天增加了一个支付方式,我希望所有的商品都支持这种支付方式,这个时候其实就需要精细化更新了。
总的来说这是一种思考的方向,具体还是要根据实际开发中的需要来使用不同的数据结构,没有万能药。
网友评论