【问题标题】:Using enums instead of switch in Java在 Java 中使用枚举而不是 switch
【发布时间】:2016-02-18 14:47:38
【问题描述】:

我使用的是 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...

【问题讨论】:

  • 你到底想做什么?
  • 不要使用Enum.ordinal()。引用Javadoc:“大多数程序员不会使用这种方法。它是为复杂的基于枚举的数据结构设计的,例如 EnumSet 和 EnumMap。”。有关为什么不使用它的详细说明,另请参阅 Effective Java,例如脆弱性。另外,Enum.toString() 的默认实现已经产生了相同的输出。
  • 我想将程序的字符输入限制为几个特殊字符。这里是 X、Y 和 Z。

标签: java enums switch-statement default


【解决方案1】:

两件事:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      如果-否则

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

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

      【讨论】:

        【解决方案4】:

        下面试试

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

        它对我有用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-30
          • 1970-01-01
          • 1970-01-01
          • 2011-12-27
          相关资源
          最近更新 更多