使用枚举代替Java中的switch

问题描述 投票:0回答:4

我使用的是枚举而不是switch,但是有一个问题。在交换机中,您可以使用默认情况。但是使用枚举呢?当我提供与定义的枚举不同的输入时,程序崩溃。

例如:

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

我已经进行了研究,但无法正常工作。考虑过将else语句放入toString(),但似乎无法在其中放入deafult ...

java enums switch-statement default
4个回答
0
投票

您总是可以捕获引发的异常并提供自己的默认值

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

}

2
投票

两件事:

  1. 默认情况下,一个枚举具有一个默认实现,该实现只返回其.name();因此,这里的覆盖是多余的;
  2. 枚举是“像其他类别一样”的类(几乎如此),因此它们具有构造函数;如果要将数据“添加”到枚举,则正确的方法如下:

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

    private final String whatever;

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

    public String getWhatever()
    {
        return whatever;
    }
}

0
投票

有三种方法可以做到这一点:

if-else

比较每个序数值并返回相应的值。

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

开关

打开序数值并返回相应的值。

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

枚举属性

返回枚举的赋值。

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

优化查询

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

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

0
投票

尝试以下

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

它为我工作

© www.soinside.com 2019 - 2024. All rights reserved.