2012-01-28 10 views
5

Quiero portar este módulo de permiso C# a java, pero no estoy seguro de cómo puedo hacerlo cuando no puedo guardar el valor numérico en la base de datos y luego enviarlo a la representación de la enumeración.Confusión enum de Java con la creación de una máscara de bits y comprobación de permisos

en C#, que crean una enumeración de esta manera:

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

A continuación, puedo crear un conjunto de permisos como:

ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove; 

entonces puedo guardar esto en la base de datos usando:

(int)johnsArticlePermission 

Ahora puedo leerlo desde la base de datos como un entero/largo, y lo hechizo como:

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

Y puedo comprobar los permisos como:

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

} 

¿Cómo puedo hacer esto en Java? Por lo que entiendo, en java, puede convertir la enumeración en un valor numérico y luego convertirla de nuevo a una enumeración java.

Ideas?

+1

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

+0

[Y esto, que dirigiéndose directamente a las enumeraciones de almacenamiento de la base de datos] (http://stackoverflow.com/questions/229856/ways-to-save-enums-in-database). –

+0

@DaveNewton si uso un enumset, no puedo guardarlo de la misma manera ya que obtener el nombre no tendrá sentido si tengo 3 valores enum ¿No? – Blankman

Respuesta

6

Lo que realmente necesita aquí es un EnumSet, se describe en la API de la siguiente manera:

conjuntos de enumeración se representan internamente como vectores de bits. Esta representación es extremadamente compacta y eficiente. El rendimiento en el espacio y el tiempo de esta clase debe ser lo suficientemente bueno como para permitir su uso como una alternativa de alta calidad y segura para el tipo a las tradicionales "bit flags".

Aquí hay una buena overview of EnumSet, y otra: Playing with EnumSet.

Una enumeración es una clase bajo la capucha para que pueda agregar métodos a la misma. Por ejemplo,

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 le dará una List de ArticlePermission objetos de un valor entero, supuestamente creado por la operación lógica OR ArticlePermission el valor de los objetos.

+0

¿de dónde vinieron 'values ​​()'? – Blankman

+1

@Blankman 'values ​​()' es una [característica de enums] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). –

+1

Si usa Android, evite EnumSets; estos son muy ineficientes para DalvikVM. –

Cuestiones relacionadas