【发布时间】:2015-02-04 22:39:52
【问题描述】:
Java 为每个Enum<T> 对象提供了一个valueOf() 方法,因此给定一个enum 类似
public enum Day {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
可以进行类似的查找
Day day = Day.valueOf("Monday");
如果传递给valueOf() 的字符串与现有的Day 值不匹配(区分大小写),则会抛出IllegalArgumentException。
要进行不区分大小写的匹配,可以在Day 枚举中编写自定义方法,例如
public static Day lookup(String day) {
for (Day d : Day.values()) {
if (d.name().equalsIgnoreCase(day)) {
return type;
}
}
return null;
}
是否有任何通用方法,而不使用缓存值或任何其他额外对象,只编写一次像上面这样的静态lookup() 方法(即,不是每个enum),假设values()方法在编译时隐式添加到Enum<E> 类中?
这种“通用”lookup() 方法的签名类似于Enum.valueOf() 方法,即:
public static <T extends Enum<T>> T lookup(Class<T> enumType, String name);
它会为任何enum 完全实现Day.lookup() 方法的功能,而无需为每个enum 重新编写相同的方法。
【问题讨论】:
-
我相信你知道,但问题出现的原因是你不坚持Java enum naming convention。如果您使用标准大写命名,您只需在查找方法中使用
Day.valueOf(day.toUpperCase()) -
不,无论大小写或其他命名约定如何,都适用相同的要求。用于所有目的的通用方法是请求。 :-)
-
添加到@kiedysktos 建议(对于其他阅读者来说,这是迄今为止最直接的解决方案),我怀疑 OP 违反了命名约定,因为他们希望 toString 表单只有第一个字母大写就像语法正确的英语一样。您仍然可以通过覆盖 toString 方法来完成此操作:
return super.toString().substring(0, 1).toUpperCase() + super.toString().substring(1);