Java Enum.valueOf() 值不存在时的效率

标签 java enums

您认为哪个更有效率?

'WeekDay' 的使用只是一个例子:

public enum WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}

首先循环并验证日期字符串:

public void parseString(String line) {
    String[] tokens = line.split();
    String day = tokens[1]; // day 'should' always be a weekday
    if (isValidWeekDay(day)) {
        WeekDay weekDay = WeekDay.valueOf(day); // won't throw exception
        ...
    } else {
        throw new InvalidWeekDayException(day); // subclass of RuntimeException
    }
}
private boolean isValidWeekDay(String day) {
    for (WeekDay weekDay : WeekDay.values()) {
        if(weekDay.toString().equals(day))
           return true;
    }
    return false;
}

或者因为在 99.99% 的情况下,日期是正确的:

public void parseString(String line) {
    String[] tokens = line.split();
    String day = tokens[1]; // day 'should' always be a weekday
    try {
        WeekDay weekDay = WeekDay.valueOf(day); // might throw exception
        ...
    } catch (IllegalArgumentException e) {
        throw new InvalidWeekDayException(day, e);
    }
}

更新:

澄清一下,输入字符串将来自客户端应用程序,而不是用户。因此换句话说,在此示例中收到非工作日将是一个错误。

最佳答案

如前所述,您必须进行剖析才能确定。即使在您自己的解析方法中,您也可以通过在解析列表时返回枚举来加快速度。

private WeekDay getValidWeekDay(String day) {
    for (WeekDay weekDay : WeekDay.values()) {
        if(weekDay.toString().equals(day))
           return weekDay;
    }
    return null;
}

除非这是应用程序的时间关键部分,否则在任何一种情况下我都不会担心它,而只是采用最易读的方法。我认为这将使用 WeekDay.valueOf() 方法。

如果您不想处理异常,则在枚举中创建您的值的 Map 并有效地从查找中执行与 valueOf() 等效的操作,如果找不到则返回 null。

public enum WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;

    private static Map<String, WeekDay> valueMap;

    public static WeekDay getValue(String possibleName)
    {
        if (valueMap == null)
        {
            valueMap = new HashMap<String, WeekDay>();
            for(WeedDay day: values())
                valueMap.put(day.toString(), day);
        }
        return valueMap.get(possibleName);

    }
 }

这实际上就是 valueOf() 方法正在做的事情,除了它在找不到时抛出 IllegalArgumentException。这种方法将简单地返回 null,因此不会生成堆栈跟踪。

关于Java Enum.valueOf() 值不存在时的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7164906/

相关文章:

c# - 计算枚举上设置的标志数

java - 在 "ZipFile zipfile = new ZipFile("X 中设置路径 X");"

java - 从文本文件中弹出 double

java - 将地址数据类型转换为字符串

c# - 可空枚举不包含错误

go - 如何使 Go 将枚举字段打印为字符串?

java - 带有 Kerberos 身份验证的 Restful Web 服务

java - NullPoinerException Autowiring bean - Java、Spring

java - Scala 模式匹配 Java 枚举值

java - EnumSet 可以按书面顺序返回值吗?