今天分享 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、不直观:当然凡是都有利弊,此方案业务代码可读性稍差,尤其是对位运算不熟悉的小伙伴,这里提供一个补救措施是把注释写清楚,方便他人阅读理解。
本文分享了Java项目中使用位运算进行权限控制的实战。该方案代码简洁,节省代码量,效率高,适合高并发场景,且属性变动影响小。不过业务代码可读性稍差,可通过写清注释来补救,实战中可按需调整。

676

被折叠的 条评论
为什么被折叠?



