这是永久“冗长的如果或切换”困境的变体......
考虑一个使用静态方法的多线程应用程序,该方法包含一个长(超过十几个条件)if
语句,它检查对象的类型并相应地返回一个值,即类似
public static String checkType(Class<?> type)
{
if (type == A.class)
{
return aString;
}
else if (type == B.class)
{
return bString;
}
...
else if (type == z.class)
{
return zString;
}
}
显然 switch 语句在这里并不直接适用,所以一个常见的模式是有一个enum
并调用它的valueOf()
,即做类似的事情
public enum Strings
{
A(aString), B(bString), ..., Z(zString)
private final String value;
private Strings(String value)
{
this.value = value;
}
public String value()
{
return this.value;
}
}
所以,checkType()
可以重写为
public static String checkType(Class<?> type)
{
return Strings.valueOf(getActualTypeName(type.getClass().getName())).value();
}
对在生产代码中添加的值进行适当的检查,null
并在方法内部对非原始类型进行一些字符串处理getActualTypeName()
,以从类似字符串中检索实际类型名称"class java.lang.Long"
(对于原始类型,该getName()
方法返回预期的字符串,例如 " long"
)。
但是,如果valueOf()
不是线程安全的,则这将无法在并发环境中工作。这同样适用于使用(普通)Map
对象,可能这两种选择是相同模式的变体,因为enum.valueOf()
显然是基于
Enum.valueOf(Class<T> enumType, String name)
调用
enumType.enumConstantDirectory().get(name);
在Class.java
课堂上。
enumConstantDirectory()
每次调用该方法时,都会返回一个从数组HashMap
副本创建的新方法。values()
那会是线程安全的吗?