抽象java枚举

抽象java枚举,java,enums,abstract-class,Java,Enums,Abstract Class,我编写的库应该依赖于枚举,但实际的枚举应该由库的用户定义 在下面的示例中,authorize方法需要枚举类型Permission的参数 acl.authorize(userX, Permission.READ, Permission.WRITE) 我的库应该能够处理库用户定义的任意权限。但是没有权限枚举,我无法编译我的库。所以我需要像这样的东西 abstract enum Permission 在我的图书馆里。有解决办法吗?以下是我建议的步骤 编写注释-public@interface权限

我编写的库应该依赖于枚举,但实际的枚举应该由库的用户定义

在下面的示例中,
authorize
方法需要枚举类型
Permission
的参数

acl.authorize(userX, Permission.READ, Permission.WRITE)
我的库应该能够处理库用户定义的任意权限。但是没有
权限
枚举,我无法编译我的库。所以我需要像这样的东西

abstract enum Permission

在我的图书馆里。有解决办法吗?

以下是我建议的步骤

  • 编写注释-
    public@interface权限
  • 让用户使用该批注对其每个权限枚举进行批注:

    @Permission
    public enum ConcretePermissionEnum {..}
    
  • 使您的
    授权
    方法如下所示:

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

  • 如果您希望权限枚举具有某些特定方法,或者只需要一个“标记”,则可以让用户枚举实现您的接口(而不是注释):

    这将启用编译时检查,而不是运行时检查,与注释方法一样,
    authorize
    方法签名如下所示:

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

    我将使用enum随后将实现的接口。类似于

    public interface PermissionType{}
    
    例如,客户端将使用它来定义枚举,例如

    public enum Permission implements PermissionType
    [...]
    

    然后,您的API将使用
    PermissionType
    type

    接受参数。我的库不应该知道读取权限。该示例显示了my library的用户定义枚举的用法。我的库应该只知道“权限枚举的某些元素”,就像JDK7的“更多NIO特性”中使用的那个样。例如:@TomHawtin-tackline:该链接现在已失效。新链接万岁:
    public enum Permission implements PermissionType
    [...]