您认为哪个更有效率?
'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/