通过二进制校验手段,实现开关状态status的多种表达

  • 需求介绍: 原本字段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);

    /**
     * int对应位为1的值
     * 0000 0100: 对应int为4
     */
    private final int value;

    /**
     * 对应责任链handler的类
     */


    RoutePass(int index) {
        // 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) {
        // 通过clazz找到对应
        for (RoutePass c : RoutePass.values()) {
            // 通过与运算进行判断
            return (code & c.value) == c.value;
        }
        return false;
    }

    /**
     * 判断是否有开启具体开关
     *
     * @param code 开关数值
     * @param pass 具体开关
     * @return
     */
    public static boolean isOpen(int code, RoutePass pass) {
        // 通过clazz找到对应
        // 通过与运算进行判断
        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);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值