3

我喜欢番石榴前置条件,但我真正需要的是另一种方法 - 检查数字是否在范围内。像这样

//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吗?

4

2 回答 2

8

我要说的原因有很多。以下是主要的:

  • “值超出范围”没有标准的 Java 异常类型。请注意,每个Preconditions方法都会为其检查的内容抛出特定的异常类型:NullPointerExceptionIllegalArgumentException或。广义范围检查没有比抛出更具体的异常。IllegalStateExceptionIndexOutOfBoundsExceptionIllegalArgumentException
  • checkArgumentcheckState做你需要的一切。你可以只写checkArgument(value >= min && value <= max, ...)。您正在检查的内容简单明了。

此外:

  • 您可能想要在这里有太多不同的组合。@rsp 提到的排他/包含界限等。
  • 只允许ints 作为边界是有限的,所以你真的很想在那里允许任何Comparable东西。
  • 此时您注意到您只是在检查值是否包含在Range中。
于 2011-11-21T20:32:43.500 回答
6

我认为你可以通过使用非常接近checkArgument()

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

如果您将消息字符串添加到您自己的常量定义中,它就不是太多样板文件,并且具有您需要的所有灵活性。

于 2011-11-21T20:33:35.137 回答