在Java中使用枚举而不是切换

时间:2016-02-18 14:47:39

标签: java enums switch-statement default

我使用enum而不是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));
}

我已经研究过,无法让它发挥作用。考虑在toString()中添加else语句,但似乎无法将deafult放在那里......

4 个答案:

答案 0 :(得分:2)

两件事:

  1. 默认情况下,枚举有一个默认实现,只返回其.name();因此,你的覆盖是多余的;
  2. 枚举是“像任何其他人一样”的类(几乎如此)所以他们有构造函数;如果要将数据“添加”到枚举,正确的方法如下:
  3. public enum MyEnum
    {
        FOO("my data"),
        ;
    
        private final String whatever;
    
        MyEnum(final String whatever)
        {
            this.whatever = whatever;
        }
    
        public String getWhatever()
        {
            return whatever;
        }
    }
    

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

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

对我有用