2016-12-12 41 views
2

我有如下所示的枚举,从中我需要调用它适当的方法基础它是什么类型的事件。如何根据枚举类型传递的方式调用enum方法?

public enum EventType { 

    EventA { 
    // cannot call this method 
    public Map<String, Map<String, String>> execute(String eventMapHolder) { 
     final Map<String, String> holder = parseStringToMap(eventMapHolder); 
     if (holder.isEmpty() || Strings.isNullOrEmpty(holder.get("m_itemId"))) { 
     return ImmutableMap.of(); 
     } 
     String itemId = holder.get("m_itemId"); 
     Map<String, String> clientInfoHolder = getClientInfo(itemId); 
     holder.putAll(clientInfoHolder); 
     return ImmutableMap.<String, Map<String, String>>builder().put(EventA.name(), holder) 
      .build(); 
    } 
    }, 
    EventB { 
    // cannot call this method 
    public Map<String, Map<String, String>> execute(String eventMapHolder) { 
     final Map<String, String> holder = parseStringToMap(eventMapHolder); 
     if (holder.isEmpty() || Strings.isNullOrEmpty(holder.get("m_itemId"))) { 
     return ImmutableMap.of(); 
     } 
     return ImmutableMap.<String, Map<String, String>>builder().put(EventB.name(), holder) 
      .build(); 
    } 
    }; 

    public Map<String, String> parseStringToMap(String eventMapHolder) { 
    // parse eventMapHolder String to Map 
    } 

    public Map<String, String> getClientInfo(final String clientId) { 
    Map<String, String> clientInfoMap = Maps.newHashMap(); 
    // code to populate this map 
    return clientInfoMap; 
    } 

    public Map<String, String> getDeviceInfo(final String itemId) { 
    Map<String, String> deviceInfoMap = Maps.newHashMap(); 
    // code to populate this map 
    return deviceInfoMap; 
    } 
} 

问:

例如:如果我"EventA",那么我想调用它的execute方法。同样,如果我得到"EventB",那么我想调用它的execute方法等。现在由于显而易见的原因,它不能工作,因为它无法在相同的枚举中找到execute方法。

String eventType = String.valueOf(payload.get("eventType")); 
String eventMapHolder = String.valueOf(payload.get("eventMapHolder")); 
// this below line gives compilation error as it is not able to find execute method. 
Map<String, Map<String, String>> processedMap = EventType.valueOf(eventType).execute(eventMapHolder); 

我需要根据传递什么类型的事件来执行某些操作。

  • 如果"EventA"通过,那么首先我将eventMapHolder串入地图(我们称之为持有人),然后我从支架地图提取itemId,然后我通过itemIdgetClientInfo方法,这反过来又返回地图(我们称之为clientInfoHolder)。然后我将clientInfoHolder地图中的所有内容放入holder地图,然后根据holder及其关键字最终返回另一个地图。
  • 如果"EventB"通过,那么首先我将eventMapHolder字符串转换为Map(我们称之为持有者),然后我在holder地图上创建一个新的不可变地图基础,并返回该地图。

一般来说,我会在同一个枚举类中有更多的事件类型,他们大多会做与EventA和EventB相同的操作。

什么是使这项工作的权利和oop方式?我怎样才能调用该特定枚举类型的方法?

如果还有其他更好的方法或任何其他设计模式来做到这一点,那么我愿意提供建议。

回答

5

只要您在每个枚举实例中重写该方法,就可以在enum上定义抽象方法。这里有一个简单的例子:

public enum EnumWithMethod { 

    VALUE_A { 
    @Override 
    public String enumMethod(String s) { 
     return s + "-A"; 
    } 
    }, 
    VALUE_B{ 
    @Override 
    public String enumMethod(String s) { 
     return s + "-B"; 
    } 
    }; 

    public abstract String enumMethod(String s); 

} 

因此,给出一个任意枚举实例,您可以拨打enumMethod

EnumWithMethod e = EnumWithMethod.VALUE_A; 
String str = e.enumMethod("asdf"); //asdf-A 

对于你的榜样,这是因为加入

public abstract Map<String, Map<String, String>> execute(String eventMapHolder); 

一样简单致你的EventType枚举。

+0

现在理解..感谢您的帮助。你认为这是使用枚举在这里和写一堆代码在相同的枚举类的这种问题的正确模式?一般来说,我将在该枚举中包含大约15个EventTypes,所以我的类将会非常大。你有没有看到其他可以做同样事情的模式,可能适合这类问题? – john

+0

这种方法最大的优点是它迫使你在每个实例中都实现该方法。主要的选择是一个大型的'switch'块,无论是在这里还是在辅助工具类中,但是当我看到这些时,我会感到紧张,因为它很容易(尤其是在项目增长的时候)忘记在添加新枚举时更新它值。如果你只是在做一种方法,我认为这很好。如果你开始实施他们的一大堆,也许把这些方法拉出来不同的班级? – Mshnik