实现相同接口(interface)的枚举上的Java开关

标签 java oop enums interface

我有一个小组项目,我们被迫使用提供的接口(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/

相关文章:

java - 原始类型。对泛型类型的引用应该被参数化

c++ - 切片在 C++ 中意味着什么?

c++ - 在循环中使用枚举和值一致性

c# - 可以根据字符串名称加载枚举吗?

java - 替换java属性中占位符中的属性值 - IntelliJ 2017.2

java - 为什么我们不能用java中的 "this"关键字创建一个对象呢?

java - Spring Security 的 AJAX 请求给出 403 Forbidden

c++ - 通过构造函数初始化枚举

java - 我如何限制我的客户使用类里面选定的方法?

java - 无模式 JDialog 需要在父级之上可见