[英]Reducing if-else statements in Java
我有以下代码:
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条件,以便没有那么多代码?
你应该使用一些东西来消除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());
}
}
使用从String
映射到ObjectType.TYPE_x
值的任何类型的Map
(您必须填充它)。
我会将此添加为枚举的功能:
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));
}
如果你能重构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
语句是O(n)
。
除了单个setType
您可能会考虑更复杂的实现,也可能会想到状态模式实现。
1.如果你的条件数超过3,你可以去Switch语句。
2.您可以将if else语句转换为三元语句
其他建议很棒 - 特别是更聪明的枚举和地图。 但是我要解决的第一个最基本的重构是提取一个直接返回枚举的方法,并让调用者只执行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()
方法可能会引导您使用简单的基于地图或枚举的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.