在交换机上安全使用Enum valueOf进行字符串比较

时间:2017-09-28 15:07:39

标签: java enums

如果我得到的字符串与枚举ACTION上支持的字符串不同,如何安全地实现valueOf的使用。我的意思是,即使ACTION.valueOf(valueToCompare)不是有效的枚举成员,也可以强制valueToCompare获取有效值

valueToCompare"CRY""CRYALOT""cryalot"等时,我得到了预期的执行权。

我在代码中得到java.lang.IllegalArgumentException

public enum ACTION{
    CRY,
    CRYALOT;
}

public static void main(String[] args) {

    String valueTocompare = "posible not expected value".toUpperCase();

    switch (ACTION.valueOf(valueToCompare)) {
        case CRY:
            System.out.println("Cry");
            break;
        case CRYALOT:
            System.out.println("Cry a lot");
            break;
        default:
            System.out.println("catch posible not expected value");
            break;
    }
}

EDIT&使用解决方案:

我通过使用try-catch解决了这个问题,因为@Peter Lawrey建议:

public enum ACTION{
    CRY,
    CRYALOT,
    NOTVALID;
}

public static void main(String[] args) {

    String valueToCompare = "NOTVALID";
    ACTION action;
    try {
        valueToCompare= "variable posible not expected value".toUpperCase();
        action = ACTION.valueOf(valueToCompare);
    } catch(IllegalArgumentException e){
        System.out.println("Handled glitch on the Matrix");
        action = ACTION.NOTVALID;
    }

    switch (action) {
        case CRY:
            System.out.println("Cry");
            break;
        case CRYALOT:
            System.out.println("Cry a lot");
            break;
        default:
            System.out.println("catch posible not expected value");
            break;
    }

    System.out.println("We continue normal execution on main thread...");
}

5 个答案:

答案 0 :(得分:5)

您需要捕获IllegalArgumentException

try {
    switch (ACTION.valueOf(valueToCompare)) {

    }
} catch (IllegalArgumentException iae) {
    // unknown
}

或者您可以创建自己的功能来执行此操作。

public static <E extends Enum<E>> E valueOf(E defaultValue, String s) {
    try {
        return Enum.valueOf(defaultValue.getDeclaringClass(), s);
    } catch (Exception e) {
        return defaultValue;
    }
}

注意:switch(null)会引发NullPointerException而不是分支到default:

答案 1 :(得分:1)

这里的问题是这一行: ACTION.valueOf(valueToCompare) - 您正试图在valueOf上运行valueToCompare,并且由于该值不是ACTION中的枚举而错误输出。它甚至没有使用switch语句打印出默认的消息。

看看我做过的改变,你会发现一些事情,主要是actionToCompare ......

    enum Action {
      CRY,
      CRYALOT,
      EXAMPLE
    }

  public static void main(String[] args) {
    Action actionToCompare = Action.EXAMPLE;
    switch (actionToCompare) {
      case CRY:
        System.out.println("Cry");
        break;
      case CRYALOT:
        System.out.println("Cry a lot");
        break;
      default:
        System.out.println("catch posible not expected value");
        break;
    }
  }

如果你坚持使用String而不是将它转换为枚举Action,请将其包装在try...catch语句中,这样如果传入无效字符串就可以处理错误。

答案 2 :(得分:0)

将异常用于流控制被认为是一种不好的做法。

    String valueToCompare = value.toUpperCase();

    ACTION action = Arrays.stream(ACTION.values())
       .filter(a -> a.name().equals(valueToCompare)).findFirst().orElse(ACTION.NOTVALID);

答案 3 :(得分:0)

一种解决方案,该解决方案不包含控制流中的异常,并且可以在没有映射条目的情况下使用默认行为将枚举名称或动作名称映射到动作:

else {
window.history.pushState({}, window.location, "&" + item.slug);
}

答案 4 :(得分:-1)

您始终可以自己构建反向查找。

enum Action {
    CRY,
    CRYALOT,
    EXAMPLE;

    // Lookup map for actions in string form.
    static Map<String,Action> lookup = Arrays.stream(values()).collect(Collectors.toMap(
            // Key is name in lowercase.
            a -> a.name().toLowerCase(),
            // Value is the Action.
            a -> a));

    public static Action lookup(String name) {
        return lookup.get(name.toLowerCase());
    }
}

public void test() throws Exception {
    System.out.println(Action.lookup("cry"));
    System.out.println(Action.lookup("CryAlot"));
}