Java에서 if-else 문 줄이기


Answers

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

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 구현을 생각할 수도 있습니다.




다른 제안 사항은 훌륭합니다 - 특히 똑똑한 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() 메서드를 사용하여 간단한지도 또는 열거 형 기반 솔루션으로 안내 할 수 있습니다.




Links