我编写了一个应该依赖枚举的库,但实际的枚举应该由我的库用户定义。
在以下示例中,authorize
方法需要枚举类型Permission
的参数。
acl.authorize(userX, Permission.READ, Permission.WRITE)
我的库应该能够处理库用户定义的任意权限。但是如果没有Permission
枚举,我就无法编译我的库。所以我需要像
abstract enum Permission
在我的图书馆。有没有办法解决这个问题?
答案 0 :(得分:21)
我会使用枚举然后实现的接口。
的内容public interface PermissionType{}
将被例如使用客户端定义一个枚举,如
public enum Permission implements PermissionType
[...]
然后您的API会使用PermissionType
类型
答案 1 :(得分:1)
以下是我建议的步骤。
public @interface Permission
让用户使用该注释注释每个权限枚举:
@Permission
public enum ConcretePermissionEnum {..}
使您的authorize
方法看起来像:
public boolean authorize(User user, Enum... permissions) {
for (Enum permission : permissions) {
if (permission.getClass().isAnnotationPresent(Permission.class)){
// handle the permission
}
}
}
如果您希望Permission枚举具有某些特定方法,或者只是想要'标记',那么您可以使用户枚举实现您的接口(而不是注释):
interface PermissionInterface {..}
enum ConcretePermission implements PermissionInterface
这将启用编译时而不是运行时检查,与注释方法一样,authorize
方法签名如下所示:
public boolean authorize(User user, PermissionInterface... permissions)