24

我有以下代码:

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 条件以免有那么多代码?

4

6 回答 6

50

您应该使用一些东西来消除someObject.setType(ObjectType....))If ObjectTypeis an的重复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());
  }
}
于 2012-05-02T09:11:18.470 回答
15

使用一个Map(您必须填充)映射到您的值的String任何类型。ObjectType.TYPE_x

于 2012-05-02T09:11:02.867 回答
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));
}
于 2012-05-02T09:15:12.330 回答
4

如果您可以重构t为 a 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 所指出的,您也可以String在 Java 7 中使用。

它没有那么短,但更优雅。此外,我认为它也可能更快,因为它switchO(1)跳转表(有人可以确认这是否是真的?),是否一些if语句是O(n).

对于更复杂的实现,setType您可能还会想到状态模式实现。

于 2012-05-02T09:13:51.337 回答
2

1.如果if条件数超过3个,可以选择switch语句。

2.你可以将你的if else语句转换为三元运算

于 2012-05-02T09:19:24.513 回答
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()方法可能会引导您使用简单的基于映射或枚举的解决方案。

于 2012-05-02T13:57:59.327 回答