前言
在做系统开发的时候,经常需要增加一些字段,但是增加字段的成本比较高,需要改动的地方比较多,所有一些状态标识可以使用已有的数字类型的扩展字段存储,减少改动成本。
原理
利用二进制的01标识类型信息,不过这种一般只能标识是和否两种状态。
1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
像上表所示的二进制数据,1代表是,0代表否,十位的二进制即可以存储10种类型信息,对应的十进制才只有1024,一个32位的整数就可以存储32种类型信息,比传统的拿个十百千万位存储的数据多了十倍。
代码示例
import lombok.Data;public class FlagDemo {@Datastaticclass OrderInfo {//订单标识,存储多种订单信息,默认值0long flag;}enum FlagEnum {//1是成功,0是失败,此处简单示例几种,数字必须是2的n次方//这里的数字也可以使用1<<位数,方便理解比如(1L,1L<<2,1L<<n)VIEW("展示", 1L),PAY("付款", 2L),OLD("旧订单", 4L),SUCCESS("成功", 8L),LARGE_ORDER("大额订单", 16L),THIRD_ORDER("三方订单", 1L<<6);;//此字段可以不要,此处只是为了方便阅读String message;Long value;FlagEnum(String message, Long value) {this.message = message;this.value = value;}}static class FlagUtil {static long addFlagValue(long flag, FlagEnum flagEnum) {return flag | flagEnum.value;}static long removeFlagValue(long flag, FlagEnum flagEnum) {return (flag | flagEnum.value)-flagEnum.value;}static boolean getFlagStatus(long flag, FlagEnum flagEnum) {return (flag & flagEnum.value)==flagEnum.value;}}public static void main(String[] args) {OrderInfo orderInfo = new OrderInfo();orderInfo.setFlag(FlagUtil.addFlagValue(orderInfo.getFlag(), FlagEnum.THIRD_ORDER));System.out.println("THIRD_ORDER status:"+FlagUtil.getFlagStatus(orderInfo.getFlag(), FlagEnum.THIRD_ORDER));orderInfo.setFlag(FlagUtil.addFlagValue(orderInfo.getFlag(), FlagEnum.VIEW));System.out.println("VIEW status:"+FlagUtil.getFlagStatus(orderInfo.getFlag(), FlagEnum.VIEW));orderInfo.setFlag(FlagUtil.addFlagValue(orderInfo.getFlag(), FlagEnum.OLD));System.out.println("OLD status:"+FlagUtil.getFlagStatus(orderInfo.getFlag(), FlagEnum.OLD));orderInfo.setFlag(FlagUtil.removeFlagValue(orderInfo.getFlag(), FlagEnum.OLD));System.out.println("OLD status:"+FlagUtil.getFlagStatus(orderInfo.getFlag(), FlagEnum.OLD));System.out.println("VIEW status:"+FlagUtil.getFlagStatus(orderInfo.getFlag(), FlagEnum.VIEW));System.out.println("THIRD_ORDER status:"+FlagUtil.getFlagStatus(orderInfo.getFlag(), FlagEnum.THIRD_ORDER));}
}
执行结果
THIRD_ORDER status:true
VIEW status:true
OLD status:true
OLD status:false
VIEW status:true
THIRD_ORDER status:true