我正在创建一个带有参数的自定义注释。我想使用的参数是实现接口的枚举。有几个枚举可以作为b的候选参数用作此注释的参数。下面是一些代码示例:
接口:
public interface MyInterface {
String getSomething();
int getMore();
}
Enum的例子:
public enum MyEnum implements MyInterface {
VAL1("some1", 1),
VAL2("2val", 22);
private String something;
private int more;
private MyEnum(String something, int more) {
this.something = something;
this.more = more;
}
public String getSomething() {
return something;
}
public int getMore() {
return more;
}
}
我想实现一个带有参数的注释,该参数可以作为多个MyInterface值进行检索。假设注释是这样的:
@MyAnnotation(MyEnum.class)
或
@MyAnnotation(MyEnum.values())
所以我可以进一步检索它并将它传递给一个接受Collection参数的方法。
我如何实现一个带有参数的注释,以便我可以检索enum作为MyInterface类型的所有值?
我试着这样做:
public @interface MyAnnotation {
Class<? extends Enum<?> & MyInterface> myValues();
}
我可以这样写:
Collection<MyInterface> desired = Arrays.asList(... .getAnnotation().myValues().enumValues());
,但是这个语法无效。
不能在注释成员中使用联合类型,因此您必须放弃这个想法。
但是框架挑战:为什么你甚至关心实现者必须是枚举?
我假设你关心的是某个东西可以给你一个有限的实现集。枚举是实现这一目标的一种方法,但如果有人想以其他方式给你一个值列表,为什么要过度限制呢?
我将添加一个可以提供值集合的新接口。
interface MyInterfaceValueSource {
List<MyInterface> values();
}
枚举的实现非常简单,只调用MyEnum.values()
。
class MyEnumValueSource implements MyInterfaceValueSource {
@Override
public List<MyInterface> values() {
return Arrays.asList(MyEnum.values());
}
}
你的注释可以被修改为接受其中一个
@interface MyAnnotation {
Class<? extends MyInterfaceValueSource> value();
}
,它的用法的例子是
@MyAnnotation(MyEnumValueSource.class)
现在,如果有人想提供一个值列表,但不将其实现为enum,他们可以灵活地这样做。
class ExampleValueSource implements MyInterfaceValueSource {
@Override
public List<MyInterface> values() {
return Arrays.asList(
new MyInterfaceOne(), new MyInterfaceTwo()
);
}
}