Java 枚举继承或类似的东西

Java 枚举继承或类似的东西,java,inheritance,enums,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 wan

我有一个字符串(这是一条消息),作为输入,我需要根据字符串执行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
}
是否可以在枚举的一个方法中执行此操作?
或者我应该尝试创建一个,如果出现异常,尝试另一个,依此类推?

您真正想要的是其他枚举的聚合。最简单的方法是创建一个新的
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;
    }
}

这将更正确地将以前的枚举聚合到单个数据结构中。

正如其他人所评论的,最好仔细考虑是否确实需要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();
  }
}

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);
}

现在还不完全清楚您在问什么,但您可能希望定义字符串和常量之间的映射,如下所示:

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);
}
enum类型{FIRST,SECOND,THIRD};
映射=新HashSet(){{
输入(“一”,第一种);
输入(“两”,第一类);
//...
put(“九”,第三类);
}};
公共类型getTypeFromString(字符串s){
返回映射.get;
}

即使您在评论中给出了奇数/偶数示例,我也不认为这里可以使用多个枚举。我会使用(警告,未经测试):


然后,您可以使用
valueOf()
查找枚举元素,并使用
getType()
查找它属于三个类别中的哪一个。

您可以创建它们的映射

 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);
static final Map enumMap=new LinkedHashMap(){{
for(First e:First.values())put(e.name(),e);
for(Second e:Second.values())put(e.name(),e);
for(第三个e:Third.values())put(e.name(),e);
}};
Enum e=enumMap.get(名称);

您能描述一下您的邮件应该如何与枚举进行比较吗?您需要提供有关约束的更多信息-为什么有四个不同的枚举?在你的课程中其他地方需要吗?这里想要的行为是什么?您只是在正确的枚举上调用一个方法,并使用多个枚举而不是重写该方法吗?你想在这个程序中完成什么?@Jeremy Heiler消息字符串将包含1到9@Mark Tozzi每个枚举都意味着消息应该发送到代码的不同部分,我不能将它们全部组合到一个枚举中,因为这会停止其他部分的工作。在一个类比中,我可以得到字符串中的任何数字,我必须看看他是属于奇数枚举还是偶数枚举。枚举中的标识符应该是新名称。它们不允许是以前从其他枚举中定义的常量,如您的示例中所示。@Avi,您是对的,将问题过于简单化了。等待更多代码。如果需要,您可以将所有功能放入enum类本身;为了清楚起见,我省略了这个,这个功能在java枚举中是现成的。仅调用Type.valueOf(“一”)
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; }
}
 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);