簡體   English   中英

減少Java中的if-else語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM