2017-04-04 1 views
0

enum 유형을 사용할 때 많은 if 문을 피할 수있는 방법이 있습니까? 어쩌면 if 문 대신에 일부 디자인 패턴을 사용해야합니다.enum 유형을 사용할 때 equals가있는 명령문을 피하는 방법은 무엇입니까?

I는 다음과 같습니다 내 코드에서 많은 경우가 : // 의사 코드

public void methodOne() {  
    if(User.Type.SomeType == user.Type && User.Type.SecondType == user.Type) 
     doSomething(); 
} 

public void methodTwo() { 
    if(!User.Type.OtherType == user.Type && !User.Type.SecondType == user.Type) 
     throw new BadTypeException(); 
    doSomething(); 
} 
+1

'if (User.Type.SomeType == user.Type && User.Type.SecondType == user.Type)'절대 절대로 일치하지 않습니까? '||'을 원하셨습니까? – john16384

+1

실제 유스 케이스를 게시 할 수 있습니까? 진술을 일반적으로 열거 형, 다형성 메서드 및 "방문자"와 같은 디자인 패턴으로 정의 된 메서드로 대체 할 수 있지만 취할 접근법을 알기 위해서는 구체적인 사례를 고려해야합니다. – Joni

답변

5

사용에게 EnumSet : 개인적으로

private static final Set<User.Type> SET = EnumSet.of(User.Type.SomeType, User.Type.SecondType); 

if (SET.contains(user.type)) { 
} 
+0

예,이 표현은 if (! User.Type.OtherType == user.Type &&! User.Type.SecondType == user.Type). 고마워요 :) –

+0

그건 '개인 정적 최종 설정 SET'해야합니다. * 변수 *는 final 일 수 있지만 EnumSet 자체는 여전히 변경 가능합니다. 진정한 불변으로 만들기 위해서'SET = Collections.unmodifiableSet (EnumSet.of (...))'를 사용하십시오. – VGR

+0

정확한 유형으로 답변을 업데이트했습니다. 나는 불변 부분을 생략했다. 그것은 '사적인'문제 (클래스는 자신의 필드로 무엇을해야 하는지를 알아야한다.)에 대해서는 정말로 문제가되지 않는다. – john16384

1

나는 특히

에서이 사건에 대한 가변 인자 함수를 사용하여 좋아
private static boolean matchesAnyState(User.Type type, User.Type... types) { 
    for (User.Type listType: types) { 
     if (type.equals(listType)) { 
      return true; 
     } 
    } 
    return false; 
} 
0

물론 유틸리티 클래스를 생성하고 이러한 검사를 정적 측정으로 이동할 수 있습니다 hod,하지만 이것은 OOP 방식이 아니며 디자인을 수정하지 않습니다.

대신에 나는 당신을 하위 클래스로 분류하는 것에 대해 생각해보기를 제안 할 것입니다. 그래서

class AdminUser implements User 

class GuestUser implements User 

그리고 : 그래서 그 대신 User.Type을 갖는 당신은 interface User 또는 abstract class User 및 하위 유형이있을 것이다. 방법 doSomethingUser 인터페이스로 이동하고 하위 클래스로 구현해야합니다. 그리고 사용자에게 doSomething을 요청할 것입니다.

관련 문제