2012-01-28 13 views
5

Bu C# izin modülünü java'ya bağlamak istiyorum, ancak sayısal değeri veritabanına kaydedemediğim zaman bunu nasıl yapabilirim? numaralandırma gösterimi.Bir bit maskesi oluşturma ve izinleri denetleme ile Java enum karmaşası

C#, ben böyle bir enum oluşturun:

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

Sonra bir izni oluşturabilir gibi ayarlayın:

ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove; 

Sonra kullanarak veritabanına bu kaydedin:

(int)johnsArticlePermission 

Şimdi veritabanından bir tam sayı/uzun olarak okuyabilir ve onu şöyle yayınlayabilirim:

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

Ve ben izinlerini kontrol edebilirsiniz:

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

} 

nasıl java yapabilirsiniz? Anladığım kadarıyla, java'da, numaralandırmayı sayısal bir değere dönüştürebilir ve daha sonra bir java numarasına dönüştürebilirsiniz.

Fikirler?

+1

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

+0

[Ve DB'leri doğrudan depolamak için doğrudan adresleme yapan bu] (http://stackoverflow.com/sorular/229856/yolları-to-save-çeteleler-in-veritabanı). –

+0

@DaveNewton, bir enumset kullanırsam, OR'd 3 enum değerleri no'm varsa, ismin anlam kazanmayacağından aynı şekilde kaydedemiyorum. – Blankman

cevap

6

Burada asıl ihtiyaç böyle API açıklanan EnumSet şöyledir:

Enum setleri bit vektörler olarak dahili temsil edilir. Bu gösterimi, son derece kompakt ve verimlidir. Bu sınıfın uzay ve zaman performansı, geleneksel int tabanlı "bit bayraklarına" yüksek kaliteli, uygun maliyetli bir alternatif olarak olarak kullanılmasına izin verecek kadar iyi olmalıdır.

İşte iyi bir overview of EnumSet ve başka: Playing with EnumSet.

Bir enum, başlık altına bir sınıftır, böylece buna yöntem ekleyebilirsiniz. Örneğin,

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 tahminen ArticlePermission nesnelerin değeri VEYA işlemi tarafından oluşturulan bir tamsayı değeri, size bir ListArticlePermission nesneleri verecektir.

+0

'değerleri()' nereden geldi? – Blankman

+1

@Blankman 'values ​​()' bir [enemlerin özelliği] 'dir (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). –

+1

Android yapıyorsanız, lütfen EnumSets'ten kaçının, bunlar DalvikVM için çok verimsizdir. –