与运算,是位运算的一种。一句话概括它就是:同为1即为1,否则为零。在最近的项目中,学习到了与运算的一种使用方式。即当产品A关联到其他多个产品时,只需在产品A里添加一个字段用来保存一个关联的数值,该数值与其他产品指定的数值进行与运算即可算出产品A是否与该产品关联。说起来有点拗口,看下案例就明白了。
案例分析
如果一个系统提供给多个用户使用的话,一般会规定一些角色,然后把角色分配给指定职能的用户。假设某个系统里的角色有:系统管理(拥有整个系统操作权限的角色)、配置管理(专门负责系统参数配置管理的角色)、值班(只有少部分关于值班功能的操作权限)、数据查看(只有关于数据展示功能块的操作权限)…
一般情况下,系统管理属于内置角色,只有管理人员掌握该权限。普通工作人员掌握着值班和数据查看的操作权限。而系统维护人员掌握配置管理、数据查看的权限。如下表:

接下来,看看实现方式。
实现方法
首先,需要创建两个BEAN,一个是关于人员的,包含名字和一个保存关联的字段;一个是关于角色,包含角色名称和角色编号。

具体操作方法如下:当人员A同时拥有数据查看和值班两个角色时(角色编号分别为2和3),人员A的关联字段保存的数值为12(2^2 + 2^3,即2的编号次方的累加)。
创建两个bean,一个是关于人员的,包含名字和一个保存管理的字段;一个是关于角色,包含角色名称和角色编号。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/*** 人员Bean*/public class worker {int relationId;String name;public worker(int relationId,String name){this.relationId = relationId;this.name = name;}public int getRelationId() {return relationId;}public void setRelationId(int relationId) {this.relationId = relationId;}public String getName() {return name;}public void setName(String name) {this.name = name;}}/*** 角色Bean*/public class Role {int id;String roleName;public Role(int id,String roleName){this.id = id;this.roleName = roleName;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}}为了省(tou)事(lan),需要的数据不进行获取了,这边直接给定
1234567891011List<worker> workerList = new ArrayList<worker>();//管理人员的角色是系统管理,编号是1,所以给定的关联id是2;workerList.add(new worker(2, "管理人员"));workerList.add(new worker(12, "工作人员"));workerList.add(new worker(20, "维护人员"));List<Role> roleList = new ArrayList<Role>();roleList.add(new Role(1, "系统管理"));roleList.add(new Role(2, "数据查看"));roleList.add(new Role(3, "值班"));roleList.add(new Role(4, "配置管理"));接下来,来看看分配的权限对不对。
12345678910111213141516171819int workerListSize = workerList.size();int roleListSize = roleList.size();for (int i = 0; i < workerListSize; i++) {System.out.println("");System.out.println("人物:"+workerList.get(i).getName());System.out.println("拥有的权限为:");int role = workerList.get(i).getRelationId();for (int j = 0; j < roleListSize; j++) {int roleItem = roleList.get(j).getId();int rolePow = (int) Math.pow(2, roleItem);if((role&rolePow)>0){System.out.println(roleList.get(j).getRoleName());}}System.out.println("");}运行结果为:
12345678人物:管理人员拥有的权限为:系统管理人物:工作人员拥有的权限为:数据查看,值班人物:维护人员拥有的权限为:数据查看,配置管理
总结
这种方法,在一个关联多个时,确实也比较好使,尤其是回填时,只需要查询出这个数,然后在代码里进行判断关联就可以了。不过这个方法也有一定的弊端。因为是以2的次方进行累加的,如果关联的个数超过一定个数(比如32个?),累加的数如果还是int类型的话就有溢出的可能,这是需要注意的地方。
编码更多时候并不是写出一劳永逸的代码,而是根据具体需要写出确实可行的代码来。同样的方法也无好坏之分,只要是合适的就可以用。
|
|