在 Java 中使用枚举而不是开关

Using enums instead of switch in Java

我正在使用枚举而不是开关,但是有一个问题。在 switch 中你可以有一个 default case。但是使用枚举呢?当我提供与定义的枚举不同的输入时,我的程序崩溃了。

例如:

public enum InputChar {

    X,Y,Z;

    /**
    * get an input character
    * @return a String description of the input character
    */

   @Override
   public String toString()
   {
    String s = "";
    if (this.ordinal() == 0)
        s = "X";
    else if (this.ordinal() == 1)
        s = "Y";
    else if (this.ordinal() == 2)
        s = "Z";

    return s;
   }
}

我正在使用它:

private void checkInput(String charEntered) 
{
    textDoc = new textDoc (InputChar.valueOf(charEntered));
}

我研究过但无法正常工作。考虑过在 toString() 中加入 else 语句,但似乎无法在其中加入 deafult...

您始终可以捕获抛出的异常并提供您自己的默认值

InputChar c=InputChar.X;
trý {
 c=InputChar.valueOf(charEntered);
} catch (IllegalArgumentException e){
 System.out.println("I don't know what to do with " + charEntered+", defaulting to X");

}

两件事:

  1. 默认情况下,枚举有一个默认实现,它只是 returns 它的 .name();因此你在这里的覆盖是多余的;
  2. 枚举是 类 "like any others" (几乎是这样)所以它们有构造函数;如果要"add"数据到一个枚举中,正确的做法是:

public enum MyEnum
{
    FOO("my data"),
    ;

    private final String whatever;

    MyEnum(final String whatever)
    {
        this.whatever = whatever;
    }

    public String getWhatever()
    {
        return whatever;
    }
}

可以通过三种方式做到这一点:

如果-其他

比较每个序数值和 return 对应的值。

public enum InputChar {
    X, Y, Z;

    @Override
    public String toString() {
        if (this.ordinal() == 0) {
            return "X";
        } else if (this.ordinal() == 1) {
            return "Y";
        } else if (this.ordinal() == 2) {
            return "Z";
        } else {
            return "";
        }
    }
}

切换

打开序数值和return一个相应的值。

public enum InputChar {
    X, Y, Z;

    @Override
    public String toString() {
        switch (this.ordinal()) {
            case 0:
                return "X";
            case 1:
                return "Y";
            case 2:
                return "Z";
            default:
                return "";
        }
    }
}

枚举属性

Return 枚举的赋值。

public enum InputChar {
    X("X"),
    Y("Y"),
    Z("Z");

    private String value;

    private InputChar(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value;
    }
}

优化查找

通过 属性 快速查找枚举的最佳方法是创建查找 table。

import java.util.LinkedHashMap;
import java.util.Map;

public enum InputChar {
    X("X"),
    Y("Y"),
    Z("Z");

    private static final Map<String, InputChar> lookup;
    static {
        lookup = new LinkedHashMap<>();
        for (InputChar inChar : values()) {
            lookup.put(inChar.value, inChar);
        }
    }

    private String value;

    private InputChar(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value;
    }

    public InputChar findByValue(String value) {
        return lookup.get(value);
    }
}

尝试以下

 enum InputChar {
    X("X"),
    Y("Y"),
    Z("Z"),
    DEFAULT("D");

    private String value;

    private InputChar(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return this.getValue();
    }

    public static InputChar getEnum(String value) 
    {
        for (InputChar v : values())
            if (v.toString().equalsIgnoreCase(value))
                return v;
        return InputChar.DEFAULT;
    }}

主要

System.out.println(InputChar.getEnum("X"));
System.out.println(InputChar.getEnum("A"));

对我有用