Preconditions
Guava 提供的预先检查参数的工具,强烈建议静态导入。
这些方法有三个变体:
- 没有多余的参数,任何异常都会在没有错误信息的情况下抛出。
- 一个额外的object类型参数,使得任何异常都会随着object.toString()抛出错误信息。
- 一个额外的具有任意数量的附加对象参数的String类型参数, 。这种行为类似于printf,但是为了GWT兼容性和效率,它只允许%s指示符。
-
- Note: checkNotNull, checkArgument 与checkState 大量重载了原始组合与Object 参数而没有使用varargs数组—— 允许在大多数情况下避免上述原始调用和varags 数组分配。
第三种变体的例子:
checkArgument(i >= 0, "Argument was %s but expected nonnegative", i); checkArgument(i < j, "Expected i < j, but %s >= %s", i, j);
Signature (not including extra args) | Description | Exception thrown on failure |
checkArgument(boolean) | 用于验证方法的参数是否为true。 | IllegalArgumentException |
checkNotNull(T) | 检查value是不是非null,直接返回该值因此可以内联使用。 | NullPointerException |
checkState(boolean) | 检查对象的状态,并不依赖于方法的参数。例如,一个Iterator在调用remove之前应该检查next是否已经被调用。 | IllegalStateException |
checkElementIndex(int index, int size) | 检查index是否为具有指定大小的列表、字符串或数组中的有效元素索引。元素索引的范围可以从0到size不等。不直接传递列表、字符串或数组,只需传递其大小即可。最终返回索引。 | IndexOutOfBoundsException |
checkPositionIndex(int index, int size) | 检查index是否为具有指定大小的列表、字符串或数组中的有效元素索引。元素索引的范围可以从0到size不等。不直接传递列表、字符串或数组,只需传递其大小即可。最终返回索引。 | IndexOutOfBoundsException |
checkPositionIndexes(int start, int end, int size) | 检查[start, end) 范围内的列表、字符串或数组中的有效元素索引。带有自己的错误信息。 | IndexOutOfBoundsException |
我们倾向与利用自己的前提条件检查,而不是使用Apache Commons 的有几个原因。简要地:
- 在静态导入后,Guava 方法清晰易懂。checkNotNull 方法仅从名字就可以看出方法的作用以及将会抛出的异常。
- checkNotNull 返回验证过的参数,允许使用简单的一行构造方法:this.field = checkNotNull(field);.
- 简单可变的"printf-style" 异常信息. (这是我们为什么推荐使用checkNotNull 而不是Objects.requireNonNull的原因)
我们建议您将前提条件分解为不同的行,这可以帮助您在调试时找出哪个前提失败。另外,您应该提供有用的错误消息,这在检查自己的行上的错误时会更容易。