首先,你的权限设置真的很奇怪; “没有”和“全部”是分开的值是,呃。
那么,你可以使用枚举并依赖序号;这是一种黑客,但它可以工作。示例代码:
public enum Permission
{
NOTHING,
VIEW,
ADD,
EDIT,
INSERT,
DELETE,
ALL,
;
private static final Set<Permission> ALL_PERMISSIONS;
static {
final Set<Permission> set = values();
set.remove(NOTHING);
set.remove(ALL);
ALL_PERMISSIONS = Collections.unmodifiableSet(set);
}
private static final int NOTHING_ORDINAL = NOTHING.ordinal();
private static final int ALL_ORDINAL = ALL.ordinal();
public static Set<Permission> fromInt(final int value)
{
int mask;
mask = 1 << NOTHING_ORDINAL;
if (value & mask == mask)
return Collections.emptySet();
mask = 1 << ALL_ORDINAL;
if (value & mask == mask)
return ALL_PERMISSIONS;
final Set<Permission> set = EnumSet.noneOf(Permission.class);
for (final Permission p: ALL_PERMISSIONS) {
mask = 1 << p.ordinal();
if (value & mask == mask)
set.add(p);
}
return Collections.unmodifiableSet(set);
}
}
现在,为什么这样工作的:它是因为Enum
值的.ordinal()
是它的外观在枚举的索引。在这里,NOTHING
有序号0和ALL
已有序6.因此,如果你是一个int映射到一组权限,你必须检查,对于任何许可P,在整数p个位设置。而这又意味着i & (1 << p.ordinal()) == 1 << p.ordinal()
。
有关更多信息,请参阅Enum
的javadoc。
设计考虑:不保存“一无所有”和“全部”作为可能的值。他们都可以映射到整数:
- 0表示无权限:
- 所有值来看,加等全部权限(基本上,因为在这里你总共有5个权限,该值将是(1 < < 5)-1)。
来源
2015-11-05 12:12:04
fge
为什么“没有”是一种价值?为什么不把0作为“没有权限”?此外,您可以使用枚举来依赖序号,但{de,}序列化数据库可能是一个挑战。为什么“全部”也是一个独特的价值? – fge
使用相等运算符的任何问题? 'value == 3' –
我会考虑使用BitSet(http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html),并简单地调用'get()'来检查是否设置了一个位。 – Nim