абстрактное перечисление Java

Я пишу библиотеку, которая должна полагаться на перечисления, но фактическое перечисление должно быть определено пользователем моей библиотеки.

В следующем примере authorize метод требует параметров перечислимого типа Permission.

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

Моя библиотека должна смочь обработать произвольные полномочия, определенные пользователем библиотеки. Но я не могу скомпилировать свою библиотеку без a Permission перечисление. Таким образом, мне было бы нужно что-то как

abstract enum Permission

в моей библиотеке. Существует ли обходное решение, чтобы сделать это?

9
задан deamon 20 July 2011 в 20:40
поделиться

2 ответа

Я бы использовал интерфейс, который затем реализовал бы перечисление. Что-то вроде

public interface PermissionType{}

который будет использоваться, например, клиентом для определения перечисления, такого как

public enum Permission implements PermissionType
[...]

Тогда ваш API будет принимать параметры, используя тип PermissionType

21
ответ дан 4 December 2019 в 09:36
поделиться

Вот шаги, которые я бы предложил.

  1. написать аннотацию - public @interface Permission
  2. заставить пользователя аннотировать каждое из своих перечислений разрешений этой аннотацией:

    @Permission
    public enum ConcretePermissionEnum {...}
    
  3. Пусть ваш метод authorize выглядит так:

    public boolean authorize(User user, Enum... permissions) {
     for (Enum permission : permissions) {
     if (permission.getClass().isAnnotationPresent(Permission.class)){
     // обрабатываем разрешение
     }
     }
    }
    

Если вы хотите, чтобы ваши перечисления Permission имели некоторые специфические методы, или просто хотите "маркер", то вы можете сделать так, чтобы пользовательские перечисления реализовывали ваш интерфейс (вместо аннотации):

interface PermissionInterface {..}
enum ConcretePermission implements PermissionInterface

Это позволит осуществлять проверку во время компиляции, а не во время выполнения, как в случае с аннотацией, при этом сигнатура метода authorize будет выглядеть так:

public boolean authorize(User user, PermissionInterface... permissions)
1
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: