2011-05-09 179 views
7

我有一個字符串(這是一條消息),我得到的輸入,我需要做的4個可能的事情之一取決於字符串 我知道有eunm.valueOf()選項,但我有4個不同的枚舉,每個枚舉都有幾條可能的消息。枚舉繼承,或類似

看起來像:

public enum first{ONE,TWO,THREE}; 
public enum second{FOUR,FIVE,SIX}; 
public enum third{SEVEN,EIGHT,NINE}; 

public void work(String message){ 
    //Here I want to compare message string to one of the 3 enums 
} 

是有可能做到這一點在枚舉的一個方法是什麼? 或者我應該試着創建一個,如果我得到異常請嘗試另一個等等?

+0

能描述一下你的信息應該如何比較的枚舉? – Jeremy 2011-05-09 13:07:14

+2

您需要提供有關約束的更多信息 - 爲什麼您有四個不同的枚舉?你的程序中是否需要其他地方?這裏期望的行爲是什麼?你只是在正確的枚舉上調用一個方法,並使用多個枚舉而不是重寫該方法?你想在這個計劃中完成什麼? – 2011-05-09 13:07:15

+0

@Jeremy Heiler 消息字符串將包含ONE到NINE。 @Mark Tozzi 每個枚舉都意味着消息應該發送到代碼的不同部分,並且我不能將它們全部組合到一個枚舉中,因爲它會阻止其他部分工作。 在一個類比中,我可以得到字符串中的任何數字,並且我必須看他是否屬於ODD枚舉或偶數枚舉。 – Benny 2011-05-09 13:12:48

回答

6

正如其他人所評論的,最好是考慮一下你是否真的需要4個不同的枚舉。

但是,如果你這樣做,你可以讓他們實現一個通用的接口。然後,您可以將輸入字符串映射到適當的枚舉成員,並調用其方法來完成您想要的操作。類似於

public interface SomeInterface { 
    void doSomething(); 
}; 

public enum First implements SomeInterface { 
    ONE,TWO,THREE; 
    @Override 
    public void doSomething() { ... } 
}; 
... 
Map<String, SomeInterface> myMap = new HashMap<String, SomeInterface>(); 
for (First item : First.values()) { 
    myMap.put(item.toString(), item); 
} 
... 

public void work(String message){ 
    SomeInterface obj = myMap.get(message); 
    if (obj != null) { 
    obj.doSomething(); 
    } 
} 

這假設您想要做的4件事情對應於4枚枚舉。如果不是,你可以爲每個枚舉成員和任何枚舉成員分別重寫該方法,例如,

public enum First implements SomeInterface { 
    ONE, 
    TWO { 
    @Override 
    public void doSomething() { // do something specific to TWO } 
    }, 
    THREE; 
    @Override 
    public void doSomething() { // general solution for all values of First } 
}; 
+0

我想MAP的想法可能只是解決我的問題。 – Benny 2011-05-09 13:22:37

1

你真正想要的是其他枚舉的聚合。最簡單的方法是製作一個新的enum,將所有這些選項放入新的enum。對此有所影響:

public enum Combination { 
    NEWONE(first.ONE), NEWTWO(first.TWO), NEWTHREE(first.THREE), 
    NEWFOUR(second.FOUR), NEWFIVE(second.FIVE), NEWSIX(second.SIX), 
    NEWSEVEN(third.SEVEN), NEWEIGHT(third.EIGHT), NEWNINE(third.NINE); 

    private String contents; 

    public Combination(first f) { 
     contents = f.toString(); 
    } 

    public Combination(second s) { 
     contents = s.toString(); 
    } 

    public Combination(third t) { 
     contents = t.toString(); 
    } 

    public String toString() { 
     return contents; 
    } 
} 

這將更正確地將以前的枚舉聚合到單個數據結構中。

+0

枚舉中的標識符應該是新名稱。它們不允許是其他枚舉的先前定義的常量,如您的示例中所示。 – Avi 2011-05-09 13:12:25

+0

@Avi,你是對的 - 過分簡化了這個問題。等待更多的代碼。 – 2011-05-09 13:20:45

1

Java中的枚舉類是完全成熟的類。個人價值甚至可以超越行爲以滿足他們的需求。它太酷了。你可以用你的優勢:

public enum Value implements Worker 
{ 
    ONE, 
    TWO, 
    THREE 
    { 
     @Override 
     public void doWork(String message) 
     { 
      // overrides behavior of base enum 
     } 
    }, 
    FOUR, 
    /* ... */, 
    NINE; 

    private final String message; 

    Value() { this(""); } 
    Value(String message) { this.message = message; } 

    public void doWork(String message) 
    { 
     if (this.message.equals(message)) 
     { 
      /* ... */ 
     } 
    } 
} 

public interface Worker 
{ 
    void doWork(String message); 
} 
-1

這是不完全清楚你問什麼,但也許你要定義字符串和常量之間的映射,像這樣:

enum Type { FIRST, SECOND, THIRD }; 
Map<String, Type> mapping = new HashSet<String, Type>(){{ 
    put("ONE", Type.FIRST); 
    put("TWO", Type.FIRST); 
    //... 
    put("NINE", Type.THIRD); 
}}; 

public Type getTypeFromString(String s) { 
    return mapping.get(s); 
} 
+0

如果需要,可以將所有功能放入枚舉類本身;爲了清楚,我省略了這一點 – Avi 2011-05-09 13:19:19

+0

此功能在java枚舉中出現。只需調用Type.valueOf(「ONE」) – finalman 2013-09-27 07:14:51

0

即使考慮到你在評論中的奇數/偶數例子,我不覺得有多個枚舉是要走到這裏的。我會使用類似(警告,未經測試):

public enum Numbers { 
ONE("first"), TWO("first"), THREE("first"), FOUR("second"), FIVE("second"), SIX("second"), SEVEN("third"), EIGHT("third"), NINE("third") 

private String type; 

Numbers(String t) { this.type = t; } 
String getType { return this.type; } 
} 

然後你可以使用valueOf()查找枚舉元素,getType()找出你的三類其所屬。

1

您可以創建一個地圖所有的人都

static final Map<String, Enum> enumMap = new LinkedHashMap<String, Enum>(){{ 
    for(First e: First.values()) put(e.name(), e); 
    for(Second e: Second.values()) put(e.name(), e); 
    for(Third e: Third.values()) put(e.name(), e); 
}}; 

Enum e = enumMap.get(name);