java enum에서 값에 해당하는 enum 가져오기

2017-10-30 11:45

오늘 코드리뷰할 소스 코드는 로또 구현하는 과정에서 나온 코드를 기반으로 한다.

프로그래밍을 구현하다보면 enum을 사용하는 경우가 종종 있다. enum은 값을 가질 수 있으며, 해당 값과 일치하는 enum을 찾는 메소드를 자주 구현하게 된다.

다음 코드를 값에 해당하는 enum을 찾기 위해 switch/case 문을 사용하고 있다. 다음 코드의 valueOf 메소드를 switch/case문을 사용하지 않고 구현하도록 리팩토링한다.

public enum WinValue {
    FIFTH(3, 5000, "5등"), 
    FOURTH(4, 50000, "4등"), 
    THIRD(5, 1500000, "3등"), 
    SECOND(5, 30000000, "2등(보너스 볼 일치)"), 
    FIRST(6, 2000000000, "1등");

    private int matchNum;
    [...]

    WinValue(int matchNum, int price, String rankString) {
      this.matchNum = matchNum;
      this.price = price;
      this.rankString = rankString;
    }

    public WinValue valueOf(int matchNum, boolean bonusBall) {
      WinValue winValue = null;
      switch (matchNum) {
      case 3:
        winValue = WinValue.FIFTH;
        break;
      case 4:
        winValue = WinValue.FOURTH;
        break;
      case 5:
        winValue = checkBonusBall(bonusBall);
        break;
      case 6:
        winValue = WinValue.FIRST;
        break;
      default:
        break;
      }
      return winValue;
    }
}

위 샘플 예제는 코드스쿼드 에서 새롭게 진행 중인 마스터즈 코스에서 발췌한 코드입니다. 코드스쿼드의 마스터즈 코스는 코드 리뷰 방식의 개인별 맞춤 학습 방법입니다.

0개의 의견 from FB

BEST 의견 원본위치로↓
2017-10-30 11:57
    public WinValue valueOf(int matchNum, boolean bonusBall) {
      if (matchNum == WinValue.SECOND.matchNum) {
        return checkBonusBall(bonusBall);
      }

      for (WinValue winValue : WinValue.values()) {
        if (winValue.matchNum == matchNum) {
          return winValue;
        }
      }
      
      return null;  // or throw exception
    }

3개의 의견 from SLiPP

2017-10-30 11:57
    public WinValue valueOf(int matchNum, boolean bonusBall) {
      if (matchNum == WinValue.SECOND.matchNum) {
        return checkBonusBall(bonusBall);
      }

      for (WinValue winValue : WinValue.values()) {
        if (winValue.matchNum == matchNum) {
          return winValue;
        }
      }
      
      return null;  // or throw exception
    }
2017-10-30 15:48

enum의 경우 대부분의 stream은 다음과 같이 구현할 수 있겠네요.

enum Expression {
  PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/");

  private String expression;

  Expression(String expression) {
    this.expression = expression;
  }

  static Expression of(String expression) {
    return Arrays.stream(values())
      .filter(v -> expression.equals(v.expression))
      .findFirst()
      .orElseThrow(() -> new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression)));
  }
}

본문의 enum 코드는 bonus ball을 체크하는 로직이 있어 다른 듯 하지만 위 Expression.of() 메소드에서 filter 부분만 수정해 준다면 똑같은 방식으로 구현할 수 있다.

의견 추가하기

연관태그

← 목록으로