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

Xar*_*ren 4 java enums

如果我得到的字符串不同于枚举上支持的字符串,如何安全地实现valueOf的使用ACTION.我的意思是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑和使用的解决方案:

我通过使用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...");
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 6

您需要捕获IllegalArgumentException

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

    }
} catch (IllegalArgumentException iae) {
    // unknown
}
Run Code Online (Sandbox Code Playgroud)

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

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

注意:switch(null)抛出NullPointerException而不是分支default:


aka*_*aka 6

使用异常进行流量控制被认为是一种不好的做法。

    String valueToCompare = value.toUpperCase();

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