我有一个小组项目,我们被迫使用提供的接口(interface)和枚举。
想象一下下面的情况:
// marker interface
interface Request<T extends Response>{}
// marker interface
interface Response{}
enum TypeAction implements Request<SomeEnumClassThatImplementsResponse>{
TYPE1, TYPE2, TYPE3
}
enum OtherTypeAction implements Request<SomeOtherEnumClassThatImplementsResponse>{
OTHERTYPE1, OTHERTYPE2
}
在另一个类中,我有一个这样的请求列表:List<Request> req = new LinkedList<Request>()
我想要做的是:进行如下切换:
switch(a_request){
CASE TYPE1: ....
CASE TYPE2: ....
CASE TYPE3: ....
CASE TYPE2: ....
CASE OTHERTYPE1: ....
CASE OTHERTYPE2: ....
}
请问我怎样才能做到这一点?
重要说明:我无法将方法添加到接口(interface)和枚举中,但我可以创建新的枚举来实现您在上面看到的接口(interface)。如果可能的话,我宁愿没有两个做同样事情的枚举。
编辑:它与可能的重复答案不同,因为我不能在 Request 接口(interface)中添加任何方法,所以我不能在枚举类中实现方法。
提前致谢
最佳答案
你提到的开关显然不起作用。
我有一个(非常奇怪的)替换:创建一个包含所有列出的值的“辅助枚举”,并且有一个 Map<Request<Request<T extends Response>>, HelperEnum>
,像这样:
private enum HelperEnum {
TYPE1(TypeAction.TYPE1),
TYPE2(TypeAction.TYPE2),
TYPE3(TypeAction.TYPE3),
OTHERTYPE1(OtherTypeAction.OTHERTYPE1),
OTHERTYPE2(OtherTypeAction.OTHERTYPE2),
private Request<T extends Response> source;
private HelperEnum(Request<T extends Response> source) {
this.source = source;
}
private static Map<Request<T extends Response>, HelperEnum> map;
public static HelperEnum lookUp(Request<SomeEnumClassThatImplementsResponse> source) {
if (map == null) {
map = Arrays.stream(HelperEnum.values())
.collect(Collectors.toMap(x -> x.source, x -> x));
}
return map.get(source);
}
(未经测试!特别是我使用 Request<T extends Response>
的地方可能是错误的;我必须先测试它们。但你应该明白这一点。)
这样就可以了
switch(HelperEnum.lookUp(a_request)){
case TYPE1: ....
case TYPE2: ....
case TYPE3: ....
case OTHERTYPE1: ....
case OTHERTYPE2: ....
}
关于实现相同接口(interface)的枚举上的Java开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41890736/