Прежде всего, ваш набор разрешений действительно странный; «ничего» и «все» являются разделяемыми значениями, мм.
Ну, вы можете использовать перечисление и полагаться на ординалы; это своего рода хакерский, но он может работать. Пример код:
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);
}
}
Теперь, почему эта работа: это потому, что .ordinal()
из Enum
значения является показателем появления в перечислении. Здесь NOTHING
имеет порядковый номер 0 и ALL
имеет порядковый номер 6. Поэтому, если вы должны были сопоставить int с набором разрешений, вам нужно будет проверить, что для любого разрешения p установлен p-й бит в целочисленном размере. Что, в свою очередь, означает, что i & (1 << p.ordinal()) == 1 << p.ordinal()
.
Для получения дополнительной информации см. Javadoc Enum
.
ДИЗАЙН РАССМОТРЕНИЕ: Не хранить «ничего» и «все» в качестве возможных значений. Оба они могут быть сопоставлены с целыми числами:
- 0 для каких-либо разрешений:
- всех значений для просмотра, добавление и т.д. для всех разрешений (в основном, так как здесь у вас есть 5 разрешений в целом, то значение будет (1 < < 5) - 1).
Почему «ничего» не имеет значения? Почему бы просто не принять 0 как «никаких разрешений»? Кроме того, вы можете использовать перечисление вместо этого и полагаться на ординалы, хотя {de,} сериализация его {from, to} базы данных может быть проблемой. И почему «все» отличная ценность? – fge
Любая проблема с использованием оператора равенства? 'value == 3' –
Я бы подумал об использовании BitSet (http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html) и просто вызвал' get() 'to проверьте, установлен ли бит. – Nim