Pregunta ¿La mejor manera de admitir "enums extensibles" en anotaciones?


En mi biblioteca hay un concepto de "niveles de usuario". He proporcionado varios niveles predeterminados, pero por diversas razones quiero dar al usuario la opción de usar sus propios niveles.

Actualmente esto se implementa como

public interface AdminLevel {
    public void name();
}

public enum StandardAdminLevels implements AdminLevel {
    ADMIN,
    ANONYMOUS
}

El problema es que el usuario generalmente pasará su nivel de usuario requerido en una anotación. Cosas que he intentado y fallé:

  • Usar AdminLevel como tipo: falla con "tipo no válido para miembro de anotación"
  • Usar String como tipo pero establecer el valor con StandardAdminLevels.ADMIN.name() - Falla con "el valor del atributo debe ser constante"
  • Haciendo que StandardAdminLevels sea una clase final que no implementa nada con los campos finales públicos estáticos para cada uno de los niveles (esencialmente una enumeración) - Se produce un error con "tipo no válido para miembro de anotación"

¿Hay alguna otra forma en que no se me ocurra tener enumeraciones extensibles en las anotaciones? Intento quedarme con enumeraciones debido a su claridad y protección básica contra valores inválidos, pero la única otra forma en que puedo pensar es en constantes de cadena. El problema que tengo es que requeriría la verificación en cada punto en el que se usan los niveles de usuario, incluso en el código del cliente.

¿Algunas ideas?


8
2018-06-06 01:06


origen


Respuestas:


Una idea: cada AdminLevel posible es su propia clase. Pasa el Class de esa clase a la anotación.

public final class Admin implements AdminLevel { ... }
public final class Anonymous implements AdminLevel { ... }

@Requires(Admin.class) public void protectedMethod() { ... }

@interface Requires {
  Class<? extends AdminLevel> value();
}

7
2018-06-13 19:06