Java允许enum
作为注释值的值。如何为enum
注释值定义一种通用默认enum
值?Java枚举注释值的枚举默认值
我已经考虑了以下,但它不会编译:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public <T extends Enum<T>> @interface MyAnnotation<T> {
T defaultValue();
}
是否有这个问题的解决与否?
BOUNTY
是似乎并不像有一个直接的解决方案,这个Java角落的情况。所以,我开始寻找解决这个问题的最优雅解决方案。
的理想解决方案应该理想满足以下条件:在所有枚举
- 一个注解重复使用
- 最小的努力/复杂检索默认枚举值从注释实例枚举
SO OF FAR
沙丘:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
// By not specifying default,
// we force the user to specify values
Class<? extends Enum<?>> enumClazz();
String defaultValue();
}
...
public enum MyEnumType {
A, B, D, Q;
}
...
// Usage
@MyAnnotation(enumClazz=MyEnumType.class, defaultValue="A");
private MyEnumType myEnumField;
当然,我们也不能强制用户在编译时指定一个有效的默认值。但是,任何注释预处理都可以使用valueOf()
进行验证。
改进
阿里安提供了一个完美的解决方案,以在注释字段摆脱clazz
:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
}
...
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@MyAnnotation()
public @interface MyEnumAnnotation {
MyEnumType value(); // no default has user define default value
}
...
@MyEnumAnnotation(MyEnum.FOO)
private MyEnumType myValue;
注解处理器应该寻找既MyEnumAnnotation
上提供的默认值的字段。
这需要为每个枚举类型创建一个注释类型,但是保证编译时间检查类型的安全性。
难道这不是毫无意义吗?每当你在运行时处理注解时,通用信息就会丢失。 – Dunes
这将避免我必须为每个枚举类型定义一个注释,以便在代码中使用(这是编译时问题)。 – JVerstry
我不是故意没有用。但是泛型只在编译时才知道。您已将注释标记为保留在运行时中。但要访问注释,你必须通过思考 - 你不会有任何想法是什么泛型类型。 – Dunes