枚举继承,或类似的东西

时间:2011-05-09 13:02:55

标签: java inheritance enums

我有一个字符串(这是一条消息),我得到了输入,我需要根据字符串做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
}

是否可以在枚举的一种方法中执行此操作? 或者我应该尝试创建一个,如果我得到异常,请尝试另一个等等?

6 个答案:

答案 0 :(得分: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 }
};

答案 1 :(得分: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;
    }
}

这将更准确地将以前的枚举汇总到单个数据结构中。

答案 2 :(得分: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);
}

答案 3 :(得分: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);

答案 4 :(得分: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()找出它属于您的三个类别中的哪一个。

答案 5 :(得分:-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);
}