2016-12-12 71 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