2011-11-21 39 views
3

我喜歡番石榴的前提條件,但我真正需要的是另一種方法 - 檢查數量是否在範圍內。 Smt這樣的入住範圍precondition

//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.S.是的,我知道我可以創建像Angle這樣的新類來限制值。 –

+1

對於其中一種,您需要4種此類方法來涵蓋包容性和排他性邊界條件。 – rsp

+0

@rsp,正確。其實並沒有那麼糟糕。或者,我們可以引入'Range'類。 –

回答

8

我有很多理由說。主要有以下幾種:

  • 「值超出範圍」沒有標準的Java異常類型。請注意,每個Preconditions方法都會爲其檢查的內容拋出特定的異常類型:NullPointerExceptionIllegalArgumentExceptionIllegalStateExceptionIndexOutOfBoundsException。廣義範圍檢查沒有比IllegalArgumentException更具體的例外情況。
  • checkArgumentcheckState做你需要的一切。你可以寫checkArgument(value >= min && value <= max, ...)。這很簡單明顯,你正在檢查。

此外:

  • 有你可能想在這裏過許多不同的組合。作爲@rsp提及的獨家/包容性界限等
  • 限制只允許int s的界限,所以你真的想在那裏允許任何Comparable
  • 此時您注意到您只是檢查值是否包含在Range中。
+1

帶有'contains'方法的'Range'類是非常好的一點。非常感謝。 –

5

我認爲你可以通過使用checkArgument()非常接近:

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

,如果您添加的消息字符串到您自己的常量定義,是沒有太大的樣板,並擁有所有你需要的靈活性。