实现相同接口的枚举上的Java切换

Mey*_*hen 5 java oop enums 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    
}
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我有一个这样的请求列表:List<Request> req = new LinkedList<Request>() 我想要做的是:做一个如下所示的开关:

switch(a_request){
   CASE TYPE1: ....
   CASE TYPE2: ....
   CASE TYPE3: ....
   CASE TYPE2: ....
   CASE OTHERTYPE1: ....
   CASE OTHERTYPE2: ....
}
Run Code Online (Sandbox Code Playgroud)

我怎么能设法做到这一点?

重要说明:我无法在接口和枚举中添加方法,但我可以创建实现上面可以看到的接口的新枚举.如果可能的话,我宁愿没有两个能做同样事情的枚举.

编辑:它与可能的重复答案不同,因为我无法在Request接口中添加任何方法,因此我无法在枚举类中实现方法.

提前致谢

glg*_*lgl 4

你提到的开关显然不起作用。

我有一个(相当奇怪的)替换:创建一个“helper enum”,其中包含列出的所有值,并有一个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);
       }
Run Code Online (Sandbox Code Playgroud)

(未经测试!尤其是我使用的地方Request<T extends Response>可能是错误的;我必须先测试它们。但你应该明白。)

这样你就可以做

switch(HelperEnum.lookUp(a_request)){
    case TYPE1: ....
    case TYPE2: ....
    case TYPE3: ....
    case OTHERTYPE1: ....
    case OTHERTYPE2: ....
}
Run Code Online (Sandbox Code Playgroud)