- 需求介绍: 原本字段
status
只有0和1代表开和关, 需求变动:要显示为具体开了哪些开关, 则有多种情况, 但还是要用该字段显示 - 字段存储10进制整数值,代码上则是用二进制去判断开了具体哪些开关
枚举定义开关种类
- 二进制里,从右到左数,第一个则是第0位,这里定义
开启产品路由
是第0位开关 - 主要看
isOpen
方法,拿到数据库status字段值,进行判断是否含有指定开关 - 假设status的值是3,那么对应二进制里就是011,代表第0位和第一位开关打开了,第三位开关关闭了,通过该枚举
isOpen
方法进行验证
public enum RoutePass implements Serializable {
ANTI_BOMBING(0),
BLACK(1),
CHANNEL_LIMIT(2);
private final int value;
RoutePass(int index) {
this.value = 1 << index;
}
public static int allOn() {
return 0xFFFF_FFFF;
}
public static int allOff() {
return 0x0000_0000;
}
public static boolean isOpen(int code) {
for (RoutePass c : RoutePass.values()) {
return (code & c.value) == c.value;
}
return false;
}
public static boolean isOpen(int code, RoutePass pass) {
return (code & pass.value) == pass.value;
}
public static void main(String[] args) {
boolean open = isOpen(3, ANTI_BOMBING);
System.out.println(open);
int i = 1 << 2;
System.out.println(i);
boolean b = (4 & 5) == 4;
System.out.println(b);
int value1 = ANTI_BOMBING.value;
System.out.println(value1);
}
}