Java 枚举注释值的枚举缺省值
2022-09-02 10:21:55
Java 允许作为注释值的值。如何为注释值定义一种通用默认值?enum
enum
enum
我已经考虑了以下内容,但它不会编译:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public <T extends Enum<T>> @interface MyAnnotation<T> {
T defaultValue();
}
这个问题是否有解决方案?
赏金
似乎没有一个直接的解决方案来解决这个Java角落的情况。因此,我正在开始赏金,以找到解决此问题的最优雅的解决方案。
理想的解决方案应理想地满足以下标准:
- 一个可在所有枚举上重复使用的注释
- 从注释实例中检索默认枚举值作为枚举的工作量/复杂性最小
迄今为止的最佳解决方案
通过沙丘:
@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()
起色
Arian 提供了一个优雅的解决方案来摆脱带注释的字段: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
这需要为每个枚举类型创建一个注释类型,但保证编译时检查的类型安全。