抽象的java枚举

时间:2010-02-12 11:12:46

标签: java enums abstract-class

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

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

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

我的库应该能够处理库用户定义的任意权限。但是如果没有Permission枚举,我就无法编译我的库。所以我需要像

这样的东西
abstract enum Permission

在我的图书馆。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:21)

我会使用枚举然后实现的接口。

的内容
public interface PermissionType{}

将被例如使用客户端定义一个枚举,如

public enum Permission implements PermissionType
[...]

然后您的API会使用PermissionType类型

接受参数

答案 1 :(得分:1)

以下是我建议的步骤。

  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)){
              // handle the permission
           }
        }
    }
    

  4. 如果您希望Permission枚举具有某些特定方法,或者只是想要'标记',那么您可以使用户枚举实现您的接口(而不是注释):

    interface PermissionInterface {..}
    enum ConcretePermission implements PermissionInterface
    

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

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