枚举类型的组合
来源:互联网 发布:thinking in java在线 编辑:程序博客网 时间:2024/05/16 00:52
枚举的‘高级用法’组合运用:例如一个界面里有:增、删、查、改等操作,但对应不同用户就有不同操作权限。例如A用户只能增、删,而B用户只能查、改等等。如果在权限表中某一个字段类型指定用户的操作权限时,问题就出来了。来看看一下3种解决方式:
1.每个操作权限一条数据,缺点:每次更改权限时,避免不了删除和新增,并且数据量庞大,如果一个用户有一千权限就代表有一千条数据,那这张表的数据就不敢想象了。
2.一个字段存储所有的操作权限,每个操作权限使用 某个指定的符号作为分隔符,这种方式叫简单、方便。
3.就是使用我们的枚举组合,在一个字段存储所有的操作权限,但值只为一个数,不像方式2使用分隔符分开。
当然,还有很多方式可以解决这种问题。我们现在就来看看如何使用枚举组合来代表多个操作权限。
5.1:定义一个操作权限枚举:
public enum Role { 未分配=0, 删除数据 = 1, 修改数据 = 2, 新增数据 = 4, 查看数据 = 8, }
5.2:如果用户有删除、修改的权限在枚举定义中只有1和2的枚举,那怎么将这两个枚举值组合成一个枚举值存储到数据库呢?很简单,看一下代码:
int allRole = ((int)Role.删除数据) + ((int)Role.修改数据);//这时allRole的值为3 (两个枚举对应值相加:1+2=3),这时直接将allRole值存储到数据就可以了现在我们就来判断用户是否具有某个操作权限,先从数据库中取出权限值,以上述,allRole则为数据库中取出的值,为3,接下来我们通过位算符来判断:
Role myAllRole = (Role)allRole;//将int值强制转换为枚举 //此时,myAllRole的名称为 ‘ 删除数据, 修改数据 ’ ,值为3 //判断是否有删除权限 if ((myAllRole & Role.删除数据) == Role.删除数据) { //有 }注意此处使用了 位算符& 方式来获取判断,关于位算符的使用在此就不讲了。组合运用大概就是这样。必须注意的地方就是枚举值的定义,我们可以看到Role枚举的定义值的规律,0到1,1到2,2到4,4到8,8到16......当前的值为上个值的2次方,为什么要这样定义呢?是因为任何的组合都可以在枚举范围中某几个值的总和,例如组合值为15,那15就等于枚举定义范围里的定义值为1、2、4、8相加,15=1+2+4+8。只有按规律定义值,就可以组合成任意数。
组合必须注意的几点:
1.枚举定义时,必须打上[Flags]标记,系统才会根据这个标记来决定这个枚举是否可组合使用
2.定义枚举的值必须按以上所说的规律定义,例如:0、1、2、4、8、16、32.......也可以使用3次方的方式,例如:0、3、6、12、24..........
6.使用优点总结
1.规则性:例如数据库某个字段的值只在1、2、3、4,例如状态,当我们在录入数据时,我们可以从枚举中取值,这样避免了这个字段出现其它值,同时也使代码更容易理解,因为在取值时,我们是拿枚举定义的名称,名称是我们自定义的易理解的中文或英文。
2.易解性:就是上述所说的,枚举名称是用中文和英文来定义,在使用时,则拿枚举的名称,这样一看代码就知道。而不会在代码中写1、2、3、4这样的数字,也许过段时间自己写的都忘了了1代表什么?2代表什么?了,更何况日后他人的维护呢。
还有很多优点。希望大家能更好的用好枚举,上述某些地方讲述的不够清楚,如有需要进步的了解的朋友可以加我Q,大家一起互相学习。QQ:554044818
- 枚举类型的组合
- 枚举类型在组合数据的使用
- 枚举可能的组合
- 第7章枚举类型输出5种球里去除3种不同球的组合
- 枚举值的组合使用
- 枚举类型的用法
- 枚举类型的使用
- 枚举类型的使用方法
- 枚举类型的遍历
- 枚举类型的映射
- 枚举类型的作用
- C++的枚举类型
- 枚举类型的理解
- Java的枚举类型
- 枚举类型的定义
- 枚举类型的使用
- 枚举类型的理解
- 通用的枚举类型
- IOS静态库封装(四)
- linux shell 处理用户输入
- Makefile的二次展开
- SVN三种合并类型
- mysql常用
- 枚举类型的组合
- tnsnames.ora配制文件
- Hadoop2中的日志
- 线段树算法 ---- 扫描线之面积并
- ZOJ 3322 Who is Older?.
- 最全的Android开发资源整理--进阶必备
- ZF2搭建
- OCP 1Z0 053 33
- mac 卸载mysql,