2012-01-28 9 views
5

Tôi muốn chuyển mô-đun này cho phép java, nhưng tôi nhầm lẫn cách tôi có thể làm điều này khi tôi không thể lưu giá trị số trong cơ sở dữ liệu và sau đó truyền nó đến biểu diễn liệt kê.Java enum nhầm lẫn với việc tạo ra một bitmask và kiểm tra quyền

Trong C#, tôi tạo ra một enum như thế này:

public enum ArticlePermission 
{ 
    CanRead = 1, 
    CanWrite = 2, 
    CanDelete = 4, 
    CanMove = 16 
} 

Sau đó tôi có thể tạo ra một sự cho phép thiết lập như:

ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove; 

sau đó tôi tiết kiệm này vào cơ sở dữ liệu sử dụng:

(int)johnsArticlePermission 

Bây giờ tôi có thể đọc từ cơ sở dữ liệu dưới dạng số nguyên/dài và truyền như sau:

johnsArticlePermission = (ArticlePermission) dr["articlePermissions"]; 

Và tôi có thể kiểm tra quyền như:

if(johnsArticlePermission & ArticlePermission.CanRead == ArticlePermission.CanRead) 
{ 

} 

Làm thế nào tôi có thể làm điều này trong java? Từ những gì tôi hiểu, trong java, bạn có thể chuyển đổi liệt kê thành một giá trị số, sau đó chuyển nó trở lại thành liệt kê java.

Ý tưởng?

+1

http://stackoverflow.com/questions/1067352/can-set-enum-start-value-in-java –

+0

[Và điều này, trực tiếp giải quyết lưu trữ enums cho DB] (http://stackoverflow.com/questions/229856/cách để tiết kiệm-enums-in-database). –

+0

@DaveNewton nếu tôi sử dụng một enumset, tôi không thể lưu nó theo cùng một cách kể từ khi nhận được tên sẽ không có ý nghĩa nếu tôi có OR'd 3 enum giá trị không? – Blankman

Trả lời

6

gì bạn thực sự cần ở đây là một EnumSet, được mô tả trong API như thế này:

bộ Enum được đại diện trong nội bộ như vectơ bit. Biểu diễn này cực kỳ nhỏ gọn và hiệu quả. Không gian và thời gian hiệu suất của lớp này phải đủ tốt để cho phép sử dụng nó như là một sự thay thế an toàn, chất lượng cao cho các thẻ "bit " dựa trên int truyền thống "#".

Dưới đây là một số tốt overview of EnumSet và một loại khác: Playing with EnumSet.

Một enum là một lớp dưới mui xe để bạn có thể thêm phương pháp vào nó. Ví dụ,

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 sẽ cung cấp cho bạn một List của ArticlePermission đối tượng từ một giá trị số nguyên, có lẽ được tạo ra bởi ORing giá trị của ArticlePermission đối tượng.

+0

nơi 'giá trị()' đến từ đâu? – Blankman

+1

@Blankman 'values ​​()' là một [tính năng của enums] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). –

+1

Nếu làm Android, hãy tránh EnumSets những điều này là rất không hiệu quả cho DalvikVM. –