利用位运算实现一个字段表示多个属性
需求是这样的,我希望使用一个字段来标记多个boolean属性, 不能使用json的形式,因为使用opensearch 不能通过json解析,但是可以使用位操作运算符号,
如果不熟悉位运算符号参考:Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
网上参考了很多,发现 明明是个小问题,但是大部分实现却都有问题,在此记录一下,需要的可以直接拷走,
import java.util.Objects; /** * * * */ public enum PerformChannelRuleFlagEnum { /** * 1表示可以修改价格、2表示可以修改票面模板 */ CAN_MODIFY_TICKET_PRICE(1<<0, "允许修改票面价格"), CAN_MODIFY_TICKET_TEMPLATE(1<<1, "允许修改票面模板"), IS_DIST_PROJECT(1<<2, "是否是分销来的项目, 非当前商户项目"), ; private Integer code; private String desc; PerformChannelRuleFlagEnum(int val, String desc) { this.code = val; this.desc = desc; } public Integer getCode() { return code; } public String getDesc() { return desc; } public static CertificateTypeEnum getEnum(int code) { for (CertificateTypeEnum e : CertificateTypeEnum.values()) { if(e.getCode().equals(code)){ return e; } } return null; } //判断是否存在 public static boolean existFlag(Integer src, PerformChannelRuleFlagEnum e) { if (Objects.isNull(src)) { return false; } return (src & e.getCode()) > 0; } //添加指定属性 public static int addFlag(Integer src, PerformChannelRuleFlagEnum e) { if (Objects.isNull(src)) { return 0 | e.getCode(); } return src | e.getCode(); } //修改指定属性 used就是指定的属性值; public static int withBoolFlag(Integer src, boolean used, PerformChannelRuleFlagEnum e) { if (used) { return addFlag(src, e); } return removeFlag(src, e); } //删除指定属性 public static int removeFlag(Integer src, PerformChannelRuleFlagEnum e) { if (Objects.isNull(src)) { return 0; } return src & ~e.getCode(); } }
不熟悉的位运算的,可以看看下面的文章,
注意删除的算法他们都有问题,我在上面的代码中给出来删除的实例,可以参考上面的实例;
这是测试类:
int src=1; SaleRuleEnum ac=SaleRuleEnum.HAS_UP_PRICE; int value= SaleRuleEnum.addFlag(src, SaleRuleEnum.HAS_UP_PRICE); System.out.println(value+"二进制="+Integer.toBinaryString(value )); value= SaleRuleEnum.withBoolFlag(value,true, SaleRuleEnum.HAS_UP_PRICE); System.out.println(value+"二进制="+Integer.toBinaryString(value )); value= SaleRuleEnum.withBoolFlag(value,false, SaleRuleEnum.HAS_UP_PRICE); System.out.println(value+"二进制="+Integer.toBinaryString(value )); value= SaleRuleEnum.removeFlag(value,SaleRuleEnum.HAS_UP_PRICE); System.out.println(value+"二进制="+Integer.toBinaryString(value)); value= SaleRuleEnum.addFlag(src, SaleRuleEnum.HAS_UP_PRICE); System.out.println(value+"二进制="+Integer.toBinaryString(value )); value= SaleRuleEnum.withBoolFlag(value,false, SaleRuleEnum.HAS_UP_PRICE); System.out.println(value+"二进制="+Integer.toBinaryString(value ));
其他的新增,修改和查询 也可以参考我上面的代码
本文来自博客园,作者:aspirant,转载请注明原文链接:https://www.cnblogs.com/aspirant/p/15030744.html