2010-02-12 19 views
9

Escribo una biblioteca que debe confiar en enumeraciones pero la enumeración real debe ser definida por el usuario de mi biblioteca.resumen java enum

En el siguiente ejemplo, el método authorize requiere parámetros de la enumeración tipo Permission.

acl.authorize(userX, Permission.READ, Permission.WRITE) 

Mi biblioteca debe ser capaz de manejar los permisos arbitrarios definidos por el usuario de la biblioteca. Pero no puedo compilar mi biblioteca sin una enumeración Permission. Entonces necesitaría algo como

abstract enum Permission 

en mi biblioteca. ¿Hay alguna solución para hacer esto?

Respuesta

21

me gustaría utilizar una interfaz que sería luego implementar la enumeración. Algo parecido a

public interface PermissionType{} 

que sería utilizado por, p. Ej. el cliente para definir una enumeración como

public enum Permission implements PermissionType 
[...] 

Luego, su API aceptarían parámetros utilizando el tipo PermissionType

+0

Según lo utilizado en JDK7 "más características de NIO". Por ejemplo: http://download.java.net/jdk7/docs/api/java/nio/file/StandardCopyOption.html –

+3

@ TomHawtin-tackline: ese enlace ahora está muerto. Larga vida al nuevo enlace: http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html –

1

Estos son los pasos que sugeriría.

  1. escribir una anotación - public @interface Permission
  2. hacer que el usuario anotar cada uno de sus enumeraciones de permisos con que anotación:

    @Permission 
    public enum ConcretePermissionEnum {..} 
    
  3. Haga su método authorize parezca:

    public boolean authorize(User user, Enum... permissions) { 
        for (Enum permission : permissions) { 
         if (permission.getClass().isAnnotationPresent(Permission.class)){ 
          // handle the permission 
         } 
        } 
    } 
    

Si desea que sus enumeraciones permiso para que algunos métodos específicos, o simplemente quiere un 'marcador', entonces usted puede hacer las enumeraciones de los usuarios implementar una interfaz de los suyos (en lugar de ser anotados):

interface PermissionInterface {..} 
enum ConcretePermission implements PermissionInterface 

esto permitirá un tiempo de compilación, en lugar de un cheque en tiempo de ejecución, al igual que con el método de anotación, con la firma authorize método que parece:

public boolean authorize(User user, PermissionInterface... permissions) 
+0

Mi biblioteca no debe saber el permiso de lectura. El ejemplo muestra el uso en el que el usuario de mi biblioteca define la enumeración. Mi biblioteca solo debe saber "algún elemento de la enumeración de permiso". – deamon

+0

@daemon revisa mi actualización – Bozho