Java enum实现接口作为自定义注释参数



我正在创建一个带有参数的自定义注释。我想使用的参数是实现接口的枚举。有几个枚举可以作为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()
);
}
}

最新更新