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

値の型にマップする a Map(入力する必要があります) を使用します。StringObjectType.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、代わりに(Java 6)charを使用できます。switch

void f(char t) {

  switch(t) {

    case 'a`:
      someObject.setType(ObjectType.TYPE_A);
      break;
    case 'b':
      someObject.setType(ObjectType.TYPE_B);
      break;

    // ...

  }

}

Markoが指摘したように、Java7でも使用できますString

それほど短くはありませんが、よりエレガントです。さらに、ジャンプテーブル(これが本当かどうかを誰かが確認できますか?)、ステートメントの数がであるかどうかswitchに近いので、それも速いかもしれないと思います。O(1)ifO(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 に答える