我有以下代码:
void f(String t)
{
if(t.equals("a"))
{
someObject.setType(ObjectType.TYPE_A);
}
else if(t.equals("b"))
{
someObject.setType(ObjectType.TYPE_B);
}
// 50 more similar code
}
有没有简单的方法可以重写if-else条件,以免有那么多代码?
答案 0 :(得分:50)
你应该使用一些东西来消除someObject.setType(ObjectType....))
的重复如果ObjectType
是enum
,那么写一个类似于valueOf
的方法来实现这一点。看看你是否喜欢这种解决方案:
void f(String t) { someObject.setType(ObjectType.byName(t)); }
enum ObjectType {
TYPE_A, TYPE_B;
public static ObjectType byName(String name) {
return valueOf("TYPE_" + name.toUpperCase());
}
}
答案 1 :(得分:15)
使用从String
映射到ObjectType.TYPE_x
值的任何类型的Map
(您必须填充)。
答案 2 :(得分:14)
我会将此添加为枚举的功能:
public enum ObjectType {
TYPE_A("a"),
TYPE_B("b");
private String stringType;
private ObjectType(String stringType) {
this.stringType = stringType;
}
public String getStringType() {
return this.stringType;
}
public static ObjectType fromStringType(String s) {
for (ObjectType type : ObjectType.values()) {
if (type.stringType.equals(s)) {
return type;
}
}
throw new IllegalArgumentException("No ObjectType with stringType " + s);
}
}
...
void f(String t) {
someObject.setType(ObjectType.fromStringType(t));
}
答案 3 :(得分:4)
如果您可以将t
重构为char
,则可以使用switch
代替(Java 6):
void f(char t) {
switch(t) {
case 'a`:
someObject.setType(ObjectType.TYPE_A);
break;
case 'b':
someObject.setType(ObjectType.TYPE_B);
break;
// ...
}
}
正如Marko指出的那样,你也可以在Java 7中使用String
。
它不是那么短,而是更优雅。此外,我认为它也可能更快,因为switch
与跳转表接近O(1)
(有人可以确认这是否为真?),是否有多个if
语句是{ {1}}。
除了您可能会想到State Pattern实现的单个O(n)
之外,还有更复杂的实现。
答案 4 :(得分:2)
1.如果条件数超过3,您可以使用Switch语句。
2.您可以将if else语句转换为ternary operations
答案 5 :(得分:1)
其他建议很棒 - 特别是更聪明的枚举和地图。但是我要解决的第一个最基本的重构是提取一个方法来直接返回枚举,让调用者只执行setType到该方法的返回值。
void f(String t) {
final ObjectType type = findType(t);
if (type != null)
someObject.setType(type);
}
ObjectType findType(String t) {
if (t.equals("a")) return ObjectType.TYPE_A;
if (t.equals("b")) return ObjectType.TYPE_B;
// 50 more similar code
}
在某些情况下,这本身就足够了;在其他方面,findType()
方法可能会引导您使用简单的基于地图或枚举的解决方案。