我想将这个 c# 权限模块移植到 java,但是当我无法将数值保存在数据库中然后将其转换为枚举表示时,我很困惑如何才能做到这一点。
在 C# 中,我创建了一个这样的枚举:
public enum ArticlePermission
{
CanRead = 1,
CanWrite = 2,
CanDelete = 4,
CanMove = 16
}
然后我可以创建一个权限集,例如:
ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove;
然后我使用以下方法将其保存到数据库中:
(int)johnsArticlePermission
现在我可以从数据库中以整数/长整数形式读取它,并将其转换为:
johnsArticlePermission = (ArticlePermission) dr["articlePermissions"];
我可以像这样检查权限:
if(johnsArticlePermission & ArticlePermission.CanRead == ArticlePermission.CanRead)
{
}
我如何在 Java 中执行此操作? 据我了解,在 java 中,您可以将枚举转换为数值,然后再将其转换回 java 枚举。
想法?
最佳答案
你真正需要的是一个 EnumSet ,在 API 中这样描述:
Enum sets are represented internally as bit vectors. This representation is extremely compact and efficient. The space and time performance of this class should be good enough to allow its use as a high-quality, typesafe alternative to traditional int-based "bit flags."
枚举是底层的类,因此您可以向其添加方法。例如,
public enum ArticlePermission
{
CanRead(1),
CanWrite(2),
CanDelete(4),
CanMove(16); // what happened to 8?
private int _val;
ArticlePermission(int val)
{
_val = val;
}
public int getValue()
{
return _val;
}
public static List<ArticlePermission> parseArticlePermissions(int val)
{
List<ArticlePermission> apList = new ArrayList<ArticlePermission>();
for (ArticlePermission ap : values())
{
if (val & ap.getValue() != 0)
apList.add(ap);
}
return apList;
}
}
parseArticlePermissions
将为您提供 List
的 ArticlePermission
对象的整数值,大概是通过对 ArticlePermission< 的值进行 ORing 创建的
对象。
这里有更详细的 explanation of EnumSet .
关于Java 枚举与创建位掩码和检查权限混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9048225/