2012-01-28 41 views
5

我想將此c#權限模塊移植到java,但我很困惑,我無法在數據庫中保存數值然後將其轉換爲枚舉表示。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枚舉。

想法?

+1

http://stackoverflow.com/questions/1067352/can-set-enum-start-value-in-java – 2012-01-28 20:17:23

+0

[而這一點,從而直接尋址存儲枚舉到DB(http://stackoverflow.com /問題/ 229856 /辦法對保存-枚舉型數據庫)。 – 2012-01-28 20:31:12

+0

@DaveNewton如果我使用enumset,我不能以同樣的方式保存它,因爲如果我具有OR'd 3枚舉值no,那麼獲取名稱將沒有意義? – Blankman 2012-01-29 20:04:47

回答

6

你真正需要的這裏是一個EnumSet,在API中是這樣描述的:

枚舉集在內部表示爲位向量。這 表示非常緊湊和高效。這個類的空間和時間 應該足夠好,以允許它作爲 高品質,類型安全替代傳統基於int的「位 標誌」使用。

這是一個很好的overview of EnumSet,和另一個:Playing with 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; 
    } 
} 

parseArticlePermissions會給你從一個整數值,大概是通過或運算ArticlePermission對象的價值創造ArticlePermissionList一個對象。

+0

'values()'從哪裏來? – Blankman 2012-01-29 16:29:09

+1

@Blankman'values()'是[枚舉的特徵](http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)。 – 2012-01-29 20:07:55

+1

如果使用Android,請避免使用EnumSets,這對DalvikVM來說效率非常低。 – 2013-01-16 14:03:22