当前位置: 首页 > news >正文

位状态的使用

title: 位状态的使用 date: 2017.05.04 02:15 categories:

  • 技术博客 tags:
  • Web
  • Java

Web项目中很常见的一种需求:即用户持有各种不同的状态。

这次使用到的是其中一种,即非开即合的情况,也就是同一状态只能有开和闭两种情况,比如用户有无绑定手机、用户是否实名认证、用户订单是否送达等等。

按照之前的做法,我一般是在用户信息持有类(如User)中不停地加属性。比如isBindPhoneisBindEmail,项目初期还好说,可能也就五六个状态,再往后就是灾难,可能有二十个这种状态,再往后就不敢想了,所以得想个办法来保持User的简洁可用。

前面已经提到了,这些状态都是非开即合,学过计算机的应该都能感觉到这东西应该用二进制来做,因为二进制不是0就是1,怎么用到这里来代替之前的做法呢?

答案是:位状态。

1.编写工具类

作用是封装所有状态的值以及操作,下面是代码片段。

public class BitStatesUtil {
	public final static Long BIND_PHONE = 1L << 0; //用户是否绑定了邮箱
	public final static Long BIND_EMAIL = 1L << 1; // 用户是否实名认证

	/**
	 * @param states
	 *            所有状态值
	 * @param value
	 *            需要判断状态值
	 * @return 是否存在
	 */
	public static boolean hasState(long states, long value) {
		return (states & value) != 0;
	}

	/**
	 * @param states
	 *            已有状态值
	 * @param value
	 *            需要添加状态值
	 * @return 新的状态值
	 */
	public static long addState(long states, long value) {
		if (hasState(states, value)) {
			return states;
		}
		return (states | value);
	}

	/**
	 * @param states
	 *            已有状态值
	 * @param value
	 *            需要删除状态值
	 * @return 新的状态值
	 */
	public static long removeState(long states, long value) {
		if (!hasState(states, value)) {
			return states;
		}
		return states ^ value;
	}
}
复制代码

2.理解上面的设计

  • 代码是否合适用过来,主要还是看业务需求。
  • 不同状态的表示同样使用了数字,而在二进制下恰好只需要<<1来进行占位操作,增加新的状态时只需要在之前的基础上递增一位,示例中给出了两个状态。
  • 数据类型的选择取决于自己项目中的需求,多就取大,少就取小,long类型64位已经可以代表64种。点这里回顾你大学就了解的数据类型知识点。
  • 对不同状态的关系管理使用到了与或异或操作。点这里看他的解释。
  • 一个缺点,代码用起来可读性较差。

相关文章:

  • ELK收集网络设备日志
  • SDN第三次上机作业
  • 009-事务管理
  • 项目空隙
  • HashMap 源码分析
  • 第八周Swift总结
  • oozie的简易安装
  • php-fpm添加service服务
  • 【GitHub】给GitHub上的ReadMe.md文件中添加图片怎么做 、 gitHub创建文件夹
  • MYSQL5.5安装
  • 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)B - 幸运大奖
  • ajax框架---- ExtJS
  • 环境变量PATH、cp命令 、mv命令、 文档查看cat/more/less/head/tail
  • IOS11 光标错位问题
  • 禁用 Python GC,Instagram 性能提升10%
  • php的引用
  • [笔记] php常见简单功能及函数
  • 【面试系列】之二:关于js原型
  • 【前端学习】-粗谈选择器
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • HashMap ConcurrentHashMap
  • JavaScript新鲜事·第5期
  • JAVA多线程机制解析-volatilesynchronized
  • java中具有继承关系的类及其对象初始化顺序
  • Python语法速览与机器学习开发环境搭建
  • SegmentFault 2015 Top Rank
  • 浮现式设计
  • 前嗅ForeSpider采集配置界面介绍
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 应用生命周期终极 DevOps 工具包
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Hibernate主键生成策略及选择
  • ![CDATA[ ]] 是什么东东
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • $L^p$ 调和函数恒为零
  • (007)XHTML文档之标题——h1~h6
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (多级缓存)缓存同步
  • (二)PySpark3:SparkSQL编程
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)C#调用WebService 基础
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .aanva
  • .NET CLR Hosting 简介
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET MVC第五章、模型绑定获取表单数据