Bla*_*man 8 java permissions bit-manipulation
我想将这个c#权限模块移植到java,但是当我无法将数值保存在数据库中然后将其转换为枚举表示时,我很困惑.
在c#中,我创建了一个这样的枚举:
public enum ArticlePermission
{
CanRead = 1,
CanWrite = 2,
CanDelete = 4,
CanMove = 16
}
Run Code Online (Sandbox Code Playgroud)
然后我可以创建一个权限集,如:
ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove;
Run Code Online (Sandbox Code Playgroud)
然后我使用以下方法将其保存到数据库中
(int)johnsArticlePermission
Run Code Online (Sandbox Code Playgroud)
现在我可以将它作为整数/长整数从数据库中读出来,然后将其转换为:
johnsArticlePermission = (ArticlePermission) dr["articlePermissions"];
Run Code Online (Sandbox Code Playgroud)
我可以检查权限,如:
if(johnsArticlePermission & ArticlePermission.CanRead == ArticlePermission.CanRead)
{
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在java中这样做?根据我的理解,在java中,您可以将枚举转换为数值,然后将其转换回java枚举.
想法?
你真正需要的是一个EnumSet,在API中描述如下:
枚举集在内部表示为位向量.这种表现非常紧凑和高效.这个类的空间和时间性能应该足够好,以允许它作为传统的基于int的"位标志"的高质量,类型安全的替代品.
这是EnumSet的一个很好的概述,另一个是:使用EnumSet.
枚举是引擎盖下的一个类,因此您可以为其添加方法.例如,
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;
}
}
Run Code Online (Sandbox Code Playgroud)
parseArticlePermissions会给你一个整数值List的ArticlePermission对象,大概是通过ORing ArticlePermission对象的值来创建的.