java项目通过位运算进行权限控制的实战使用

本文分享了Java项目中使用位运算进行权限控制的实战。该方案代码简洁,节省代码量,效率高,适合高并发场景,且属性变动影响小。不过业务代码可读性稍差,可通过写清注释来补救,实战中可按需调整。

今天分享 java项目中通过位运算进行权限控制的实战使用:

我们有些实战项目采用位运算进行权限控制,代码简洁清晰明了,测试代码分析一下:

/**
 * 位运算的运用-权限控制,add,query,modify,del
 */
public class PermissionTest {

    private static final int ALLOW_SELECT = 1<<0;
    private static final int ALLOW_INSERT = 1<<1;
    private static final int ALLOW_UPDATE = 1<<2;
    private static final int ALLOW_DELETE = 1<<3;

    //当前的权限状态 volatile保证内存的可见性
    private static volatile int flag;

    public void setPermission(int permission){
        flag = permission;
    }


    /*增加权限,可以一项或者多项*/
    public int addPermission(int permission){
        flag = flag|permission;
        return flag;
    }

   /* *//*增加权限,可以一项或者多项*//*
    public void addPermission(int permission){
        flag = flag|permission;
    }*/

    /*删除权限,可以一项或者多项*/
    public void disablePermission(int permission){
        flag = flag&~permission;
    }

    /*是否拥有某些权限*/
    public boolean isAllow(int permission){
        return (flag&permission)==permission;
    }

    /*是否不拥有某些权限*/
    public boolean isNotAllow(int permission){
        return (flag&permission)==0;
    }


    public static void main(String[] args) {
        System.out.println(" 1<<0 的二进制表示:"+Integer.toBinaryString(1<<0));
        System.out.println(" 1<<1的二进制表示:"+Integer.toBinaryString(1<<1));
        System.out.println(" 1<<2的二进制表示:"+Integer.toBinaryString(1<<2));
        System.out.println(" 1<<3的二进制表示:"+Integer.toBinaryString(1<<3));
        System.out.println(" 15的二进制表示:"+Integer.toBinaryString(15));
         int startflag = 15;
		Permission permission = new Permission();
		permission.setPermission(startflag);
		permission.disablePermission(ALLOW_DELETE|ALLOW_INSERT);
        System.out.println("ALLOW_DELETE|ALLOW_INSERT后的二进制:"+Integer.toBinaryString(flag));
        System.out.println("ALLOW_DELETE|ALLOW_INSERT 后的十进制:"+flag);

		System.out.println("是否有查询权限ALLOW_SELECT="+permission.isAllow(ALLOW_SELECT));

		System.out.println("是否有新增权限ALLOW_INSERT="+permission.isAllow(ALLOW_INSERT));
		System.out.println("是否有更新权限ALLOW_UPDATE="+permission.isAllow(ALLOW_UPDATE));
		System.out.println("是否有删除权限ALLOW_DELETE="+permission.isAllow(ALLOW_DELETE));

		System.out.println("addPermission ALLOW_DELETE="+permission.addPermission(ALLOW_DELETE));
		System.out.println("addPermission ALLOW_DELETE后的二进制表示="+Integer.toBinaryString(permission.addPermission(ALLOW_DELETE)));
		System.out.println("addPermission ALLOW_DELETE="+flag);
		System.out.println("addPermission ALLOW_DELETE后的二进制表示="+Integer.toBinaryString(flag));

	}
}

核心工具类就可以这样写,注释比较清楚,可以详细测试理解,实战中可以根据业务需求具体调整,此方案的特点如下:

1、节省很多代码量:简洁扼要 。

2、效率高:性能高,尤其是在互联网项目高并发场景下更适合如此。 

3、属性变动影响小:参数变化小,如果用常规字符串表示需要新加字符串甚至需要加字段。

4、不直观:当然凡是都有利弊,此方案业务代码可读性稍差,尤其是对位运算不熟悉的小伙伴,这里提供一个补救措施是把注释写清楚,方便他人阅读理解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值