首先,你的權限設置真的很奇怪; 「沒有」和「全部」是分開的值是,呃。
那麼,你可以使用枚舉並依賴序號;這是一種黑客,但它可以工作。示例代碼:
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