关于常量0x定义
在阅读源代码的时候,我们经常看到如下定义
public static final int ORDERED = 0x00000010;
public static final int DISTINCT = 0x00000001;
public static final int SORTED = 0x00000004;
public static final int SIZED = 0x00000040;
public static final int NONNULL = 0x00000100;
public static final int IMMUTABLE = 0x00000400;
这个和我们定义成其他数字有什么区别呢
特殊发现
当我看到了下面这行代码,我突然领悟到了其中的精髓
int SPLITERATOR_CHARACTERISTICS = Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.ORDERED;
SPLITERATOR_CHARACTERISTICS变量是其他三个常量的和
解释其中关系
基本定义
int CONSTANT_1 = 0x00000001; //二进制最后八位相当于0000 0001
int CONSTANT_2 = 0x00000002; //二进制最后八位相当于0000 0010
int CONSTANT_3 = 0x00000004; //二进制最后八位相当于0000 0100
int CONSTANT_4 = 0x00000008; //二进制最后八位相当于0000 1000
复合定义
int CONSTANT_1_2 = CONSTANT_1 | CONSTANT_2;
//二进制最后八位相当于 CONSTANT_1 0000 0001
//二进制最后八位相当于 CONSTANT_2 0000 0010
//----------- 运算(或) | ---------
//二进制最后八位相当于 CONSTANT_1_2 0000 0011
判断常量CONSTANT_1_2 是否包含 CONSTANT_1
//可进行如下运算
(CONSTANT_1_2 & CONSTANT_1) == CONSTANT_1
/**
* 返回true代表包含
* 返回false代表不包含
*/
基于以上运行,我们可以设计出一套简单的权限系统
这里我们选则int类型定义(int为32位,说明我们最多定义出32权限,每个权限只能有一位为1,其他都未0)
权限设计实现
package test.utils;
import java.util.Objects;
/**
* 原定义,int类型可以定义32变量,基本原含义<blockquote><pre>
* int CONSTANT_1 = 0x00000001; </pre></blockquote>
*
* 组合定义 <blockquote> <pre>int CONSTANT_1_2 = CONSTANT_1 | CONSTANT_2; </pre></blockquote>
*
* @author it
*/
public interface Entity {
/** 原定义 */
/** {@literal 添加} */
int ADD = 0x00000001;
/** {@literal 删除} */
int DELETE = 0x00000002;
/** {@literal 更新} */
int UPDATE = 0x00000004;
/** {@literal 查询} */
int QUERY = 0x00000008;
/** {@literal 登录} */
int LOGIN = 0x00000010;
/** {@literal 注销} */
int LOGOUT = 0x00000020;
/** {@literal 描述7} */
int BAK = 0x00000040;
/** {@literal 描述8} */
int APP = 0x00000080;
/** 组合定义 */
/** {@literal ROOT管理权限} */
int ROOT = ADD | DELETE | UPDATE | QUERY | LOGIN | LOGOUT | BAK | APP;
//或者 int ROOT = 0xFFFFFFFF;
/** {@literal 浏览者权限} */
int NORMAL = QUERY | LOGIN | LOGOUT;
/** {@literal 开发者权限} */
int DEV = ADD | DELETE | UPDATE | QUERY | LOGIN | LOGOUT;
/**
* 判断是否具有权限
*
* @param composite
* @param primative
*/
static boolean hasPrivilege(final int composite, final int primative) {
Objects.requireNonNull(composite, "变量1不能为空");
Objects.requireNonNull(primative, "变量2不能为空");
return (composite & primative) == primative;
}
}
测试
package test.utils;
/**
* <p>测试一下</p>
*
* 这样设计出来的权限代码及其美观,如果是将权限保存到数据库,<b>不管具有多少权限,最终都是一个int数据而已,而且具有一定的安全性</b>
*
* @author it
*/
public class TestPrivilege {
public static void main(String[] args) {
//测试管理员是否具备备份权限
boolean flag1 = ConstantDefine.isConstain(Entity.ROOT, Entity.BAK);
System.err.println(Entity.ROOT + " " + flag1);
//测试开发者是否具备备份权限
boolean flag2 = ConstantDefine.isConstain(Entity.DEV, Entity.BAK);
System.err.println(Entity.DEV + " " + flag2);
//测试浏览者是否具有浏览权限
boolean flag3 = ConstantDefine.isConstain(Entity.NORMAL, Entity.QUERY);
System.err.println(Entity.NORMAL + " " + flag3);
}
}
测试结果
255 true
63 false
56 true
实际应用
当我们上传一个文件时候,可能需要检测文件是否重复,是否数据错误,xx业务校验
我们可以用以上定义