2012-01-28 13 views
5

Chcę przenieść ten moduł uprawnień C# do java, ale jestem zdezorientowany, jak mogę to zrobić, gdy nie mogę zapisać wartości liczbowej w bazie danych, a następnie przesłać ją do reprezentacja wyliczeniowa.Java enum zamieszanie z tworzeniem maski bitowej i sprawdzanie uprawnień

w C#, tworzę enum tak:

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

Następnie można utworzyć uprawnienia ustawione tak:

ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove; 

I następnie zapisać to do bazy danych:

(int)johnsArticlePermission 

Teraz mogę odczytać go z bazy danych jako liczbę całkowitą/długą i obsadzić go w następujący sposób:

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

I mogę sprawdzić uprawnienia takie jak:

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

} 

Jak mogę to zrobić w java? Z tego co rozumiem, w języku java można przekonwertować wyliczenie na wartość liczbową, a następnie przekonwertować z powrotem na wyliczenie java.

Pomysły?

+1

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

+0

[A to, które bezpośrednio odnosi się do przechowywania enums do DB] (http://stackoverflow.com/questions/229856/ways-to-save-enums-in-database). –

+0

@DaveNewton, jeśli używam enumsetu, nie mogę zapisać go w ten sam sposób, ponieważ otrzymanie nazwy nie ma sensu, jeśli mam OR'd 3 wartości wyliczeniowe nie? – Blankman

Odpowiedz

6

Co naprawdę trzeba tu jest EnumSet, opisane w API tak:

zestawy Enum są reprezentowane wewnętrznie jako bitowych wektorów. Ta reprezentacja jest niezwykle kompaktowa i wydajna. Wydajność tej klasy w czasie i przestrzeni powinna być wystarczająco dobra, aby umożliwić jej użycie jako wysokiej jakości, bezpiecznej dla zdrowia alternatywy dla tradycyjnych flag bitowych "bit ".

Oto dobry overview of EnumSet, a drugi: Playing with EnumSet.

Enum to klasa pod maską, więc możesz dodać do niej metody. Na przykład,

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 dadzą ci List z ArticlePermission obiektów z wartością całkowitą, prawdopodobnie stworzonego przez Oring wartość ArticlePermission obiektów.

+0

Skąd się wzięły 'wartości()'? – Blankman

+1

@Blankman 'values ​​()' jest [cechą enums] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). –

+1

Jeśli robisz Androida, proszę unikać EnumSets, które są bardzo nieefektywne dla DalvikVM. –