【问题标题】:How to create a Java annotation containing an array of unknown enums?如何创建包含未知枚举数组的 Java 注释?
【发布时间】:2014-06-23 14:30:14
【问题描述】:

我试图做的注释看起来像这样

@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD })
public @interface EnumParameter {
    Enum<?>[] disallowedValues() default {};
}

但是,我收到以下错误“注释属性 EnumParameter.disallowedValues 的无效类型 Enum[];仅允许原始类型、字符串、类、注释、枚举或其一维数组”。我打算用它来表示枚举中的某些值对该字段无效。我不知道类型,因为我打算用它来补充 UI 创建,因此可能会遇到任何类型的枚举。


为澄清而编辑。

假设我有一个枚举,

enum Direction{
    LEFT, RIGHT, BOTH;
}

我有一个字段,

Direction turnSignal;

我想指出转向灯不能有BOTH。

@EnumParameter(disallowedValues = {Direction.BOTH})
Direction turnSignal;

我已经意识到,到目前为止这似乎是不可能的。是否有理由禁止这样做?以这种方式使用枚举是否被认为是不好的风格?

【问题讨论】:

  • 不可能。枚举值必须在编译时已知。
  • 枚举中的值是什么意思?
  • @SotiriosDelimanolis 比如说我们有一个枚举Direction,它枚举了LEFT、RIGHT、UP、DOWN;然后我们要注释一个名为 turnSignal 的字段。好吧,turnsignal 是一个方向,但它不能指示向上或向下,所以我想在标签内指示。
  • 我认为通过在设置turnSignal的类方法中执行该逻辑会更好。
  • @SotiriosDelimanolis 注释是为了启用 UI 组件的程序化生成,我宁愿不为这样的所有情况编写特殊处理。

标签: java enums annotations


【解决方案1】:

这样的工作是否可行:

@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    Class<? extends Enum<?>> enumClass(); 
    String[] disallowedValues();
} 

类似

@MyAnnotation(enumClass = Direction.class, disallowedValues = {"LEFT", "RIGHT"})
Direction turnSignal;

【讨论】:

  • 它会让我到达那里,而且它可能是到达那里的唯一途径。不幸的是,它需要不必要地冗长,无法在重构中幸存下来,并且会因拼写错误而容易出现用户错误。
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多