Java에서 if-else 문 줄이기


Answers

someObject.setType(ObjectType....)) 의 반복을 제거하기 위해 뭔가를 사용해야합니다 someObject.setType(ObjectType....)) ObjectTypeenum ObjectType 경우이를 구현하는 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());
  }
}
Question

다음 코드가 있습니다.

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 조건을 다시 작성할 수있는 간단한 방법이 있습니까?




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 을 사용할 수 있습니다.

훨씬 짧지 만 우아하지 않습니다. 또한 switchO(1) 가까운 점프 테이블 ( if this true)을 사용할 수 있는지, if 문 중 다수가 O(n) 인지 여부에 관계없이 switch 가 더 빠를 것이라고 생각합니다.

하나의 setType 보다 더 복잡한 구현을 위해서 State Pattern 구현을 생각할 수도 있습니다.




1. 당신은 3 이상의 if 조건이있는 경우 Switch 문을 사용할 수 있습니다.

2. 당신은 if 문을 삼항 연산으로 변환 할 수 있습니다.




다른 제안 사항은 훌륭합니다 - 특히 똑똑한 enum과지도. 하지만 여기에서 가장 먼저 다뤄야 할 가장 기본적인 리팩토링은 열거 형을 직접 반환하는 메서드를 추출하고 호출자가 해당 메서드의 반환 값에 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() 메서드를 사용하여 간단한지도 또는 열거 형 기반 솔루션으로 안내 할 수 있습니다.




String 에서 ObjectType.TYPE_x 값이있는 유형으로 매핑하는 맵 (채워야 할 맵)을 사용하십시오.




열거 형의 기능으로 이것을 추가합니다.

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));
}