2011-05-09 95 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);