2011-11-21 4 views
3

나는 구아바 전제 조건을 좋아하지만, 내가 실제로 필요로하는 것은 하나 더 방법이다. 숫자가 범위 내에 있는지 확인한다. 이 같은 Smt범위 확인 선결 조건

//probably there should be checkStateInRange also 
public static void checkArgumentInRange(double value, int min, int max) { 
    if (value < min || value > max) { 
     throw new IllegalArgumentException(String.format("%s must be in range [%s, %s]", value, min, max)); 
    } 
} 

나는 혼자가 아니며 꽤 일반적인 경우라고 생각합니다. 그러나 그러한 방법은 존재하지 않습니다. 그러한 방법을 사용하지 않을 이유가 있습니까? com.google.common.base.Preconditions?

+0

P. 예, 값에 대한 제한을두기 위해 Angle과 같은 새로운 클래스를 만들 수 있다는 것을 알고 있습니다. –

+1

포괄적이고 배타적 인 경계 조건을 다루기 위해서는 4 가지 방법이 필요합니다. – rsp

+0

@rsp, correct. 사실 그렇게 나쁘지 않습니다. 또는'Range' 클래스를 도입 할 수 있습니다. –

답변

8

내가 말할 수있는 몇 가지 이유가 있습니다. 주요 내용은 다음과 같습니다.

  • "값이 범위를 벗어났습니다."에 대한 표준 Java 예외 유형은 없습니다. 각 Preconditions 메서드는 확인하는 특정 예외 형식 (NullPointerException, IllegalArgumentException, IllegalStateException 또는 IndexOutOfBoundsException)을 throw합니다. 일반화 된 범위 검사는 던질 IllegalArgumentException보다 더 구체적인 예외가 없습니다.
  • checkArgumentcheckState 필요한 모든 작업을 수행하십시오. checkArgument(value >= min && value <= max, ...)을 쓸 수 있습니다. 당신이 검사하고있는 것은 간단하고 명백합니다.

는 또한 :

  • 당신이 여기 할 수 있습니다 너무 많은 다른 조합이있다. @ rsp 등의 배타적/포괄적 범위
  • 경계에 대해서만 int 초를 허용하는 것이므로 Comparable을 허용하고 싶습니다.
  • 값이 Range에 포함되어 있는지 확인하는 중입니다.
+1

'contains' 메소드를 사용한'Range' 클래스는 정말 좋은 지적입니다. 고마워. –

5

난 당신이 checkArgument()를 사용하여 매우 가까이 갈 수 있다고 생각 : 당신이 당신의 자신의 상수 정의에 메시지 문자열을 추가 할 경우, 많은 보일러가 아닌 당신이 필요로하는 모든 유연성을 가지고,

checkArgument(min < value && value < max, "%s must be in range [%s, %s]", value, min, max); 

.