状态位

来源:互联网 发布:centos 7 1611下载 编辑:程序博客网 时间:2024/05/20 14:19

概述

        业务开发中,一个对象经常有多个状态位,一个状态位表示一种状态,比如电商中的商品在618一天,既参加了满减活动A,又参加了7折活动B,是否参加活动A与是否参加活动B都是该商品的相互独立的两个状态位.一种最简单的开发就是,用两个字段分别存储A与B的状态位,但是参加活动很多时,无疑是十分不可取.这个时候就需要考虑用一个字段表示多个状态位,也就是状态位复用(专业术语不知道叫啥).

        上述举例中,一种状态位只有两个值(可以称之为boolean 状态位)0与1,看见0与1就有中很熟悉的感觉,就是计算机的机器语言.

         业务中状态值通常用int表示,一个int 占4个字节,32位,状态位可以从2^0-2^(32-1),足以应付一般的业务需求.

demo

package status;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class MarkStatus {private Integer status = 0;public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}/** * 判断是否拥有此标示位的权限 *  * @param markStatus * @return */public static boolean isMarkPrivilege(Integer markBit, Integer status) {if (status == null || status == 0 || status == null || status <= 0) {return false;}int power = 1 << (markBit - 1);if ((status & power) != 0) {return true;} else {return false;}}/** * 添加某个标示位的权限 *  * @param markBit */public void addMarkPrivilege(Integer markBit) {if (markBit == null || markBit <= 0) {return;}if (this.status == null) {this.status = 0;}int power = 1 << (markBit - 1);this.status = this.status | power;}/** * 删除某个标示位的权限 *  * @param markBit */public void deleteMarkPrivilege(Integer markBit) {if (markBit == null || markBit <= 0) {return;}if (this.status == null) {this.status = 0;}int power = 1 << (markBit - 1);this.status = this.status & (~power);}public static void main(String[] args) {/*测试三种状态,组合的情况有8种,也就是status 可以表示8种状态(0 比较特殊表示不拥有一种状态位)*/int markBitA = 1;int markBitB = 2;int markBitC = 3;/*测试0-20,分别满足标识位的列表*/List<Integer> lista = new ArrayList<>();List<Integer> listb = new ArrayList<>();List<Integer> listc = new ArrayList<>();for (int i = 0; i < 20; i++) {if (MarkStatus.isMarkPrivilege(markBitA, i)){lista.add(i);}if (MarkStatus.isMarkPrivilege(markBitB, i)){listb.add(i);}if (MarkStatus.isMarkPrivilege(markBitC, i)){listc.add(i);}}System.out.println("A : " + Arrays.toString(lista.toArray()));System.out.println("B : " + Arrays.toString(listb.toArray()));System.out.println("C : " + Arrays.toString(listc.toArray()));/*打印 *      A : [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]B : [2, 3, 6, 7, 10, 11, 14, 15, 18, 19]C : [4, 5, 6, 7, 12, 13, 14, 15]*//*测试*/MarkStatus s = new MarkStatus();s.addMarkPrivilege(markBitA);System.out.println(s.getStatus());//1 在A列表中s.addMarkPrivilege(markBitB);System.out.println(s.getStatus());//3在A,B列表中s.addMarkPrivilege(markBitC);System.out.println(s.getStatus());//7在A,B,C列表中}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 爸家里人欺负我妈怎么办 部队退伍登记表填错怎么办 新手程序员第一次做项目怎么办 十六岁月经量少怎么办 大姨妈第一天痛怎么办 月经第一天很疼怎么办 神器挑战任务放弃了怎么办 内蒙古森林武警改革新兵怎么办 手挨打了有点肿怎么办 征兵过程中身份证号重复怎么办 去当兵身上有纹身怎么办 武警警卫部队改革新兵怎么办 肾结石3mm很痛怎么办 剖腹产第6天肾结石痛怎么办 左肾5mm结石怎么办 肾结石手术后反复发烧怎么办 百世快递会被退回怎么办 身份证被列入黑名单了怎么办 顺丰寄方客户要求退回快递费怎么办 蛋蛋被皮筋弹肿了怎么办 人肌肉里的绦虫卵怎么办 鞋子前面踢坏了怎么办 猫割完蛋蛋流东西怎么办 北京怡瑞被骗后怎么办 玩滑板睾丸碎了怎么办 雄鸽不会踩蛋怎么办 玩滑板蛋碎了怎么办 精子在精囊满了怎么办 孩子的睾丸一大一小怎么办 肾阳虚早射该怎么办 有奶水吸不出来怎么办 苹果mac商店里没有软件怎么办 战地1安装包损坏怎么办 战地4db显示数据异常怎么办 战地1亚服没人怎么办 战地一加载太慢怎么办 饥荒手机版怪物跟人就打狗包怎么办 电脑文件损坏开不了机怎么办 黑魂1武器损坏怎么办 系统注册表文件丢失或损坏怎么办 steam申诉填错信息怎么办