在注释中支持“可扩展枚举”的最佳方法是什么?

时间:2013-06-06 01:06:30

标签: java enums annotations

在我的图书馆中有一个“用户级别”的概念。我提供了几个默认级别,但出于各种原因希望为用户提供使用自己级别的选项。

目前,这是以

实现的
public interface AdminLevel {
    public void name();
}

public enum StandardAdminLevels implements AdminLevel {
    ADMIN,
    ANONYMOUS
}

问题是用户通常会在注释中传递所需的用户级别。我尝试过但失败的事情:

  • 使用AdminLevel作为类型 - 失败并显示“注释成员的无效类型”
  • 使用String作为类型,但使用StandardAdminLevels.ADMIN.name()设置值 - 失败,“属性值必须保持不变”
  • 使StandardAdminLevels成为一个最终类,它不会为每个级别(实质上是枚举)实现公共静态最终字段的任何内容 - 失败,并且“注释成员的类型无效”

还有其他方法我想不到在注释中有可扩展的枚举吗?我试图坚持枚举,因为它们的清晰度和对无效值的基本保护,但我能想到的另一种方法是字符串常量。我遇到的问题是需要在每个单点使用用户级别进行验证,甚至可能在客户端代码中进行验证

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

一个想法:每个可能的AdminLevel都是它自己的类。将该类的Class传递给注释。

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

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

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