[Guava官方文档翻译] 3. 前置条件检查(Preconditions Explained)
本文地址:http://www.cnblogs.com/hamhog/p/3536964.html
前置条件检查
Guava提供了一些检查前置条件的utilities。我们强烈建议静态import这些utilities。(如何在Eclipse中轻松做到。)
这些方法的参数列表有3种变形:
- 不附额外的参数。抛出exception时没有错误信息。
- 额外附一个 Object 类型的参数。抛出exception时,错误信息为 object.toString 。
- 额外附一个 String 类型的参数,以及若干个 Object 类型的参数。作用类似printf,但是为了兼容GWT以及性能考虑,只允许 %s 标识符。例如:
checkArgument(i >=0,"Argument was %s but expected nonnegative", i);
checkArgument(i < j,"Expected i < j, but %s > %s", i, j);
基本形式 (不包含额外参数) | 描述 | 失败时抛出的exception |
checkArgument(boolean) | 检查参数 boolean 是否为 true 。 用来验证方法的参数是否有效。 | IllegalArgumentException |
checkNotNull(T) | 检查参数值是否为非null。直接返回这个值,因此你可以内联地使用 checkNotNull(value) 。 | NullPointerException |
checkState(boolean) | 检查object的某些状态,不依赖方法的参数。例如: Iterator 在调用 remove 前可以用这个方法检查 next 是否被调用过。 | IllegalStateException |
checkElementIndex(int index, int size) | 检查参数 index 是否是给定size的list或string、array等的合法index。一个合法index必须>=0且<size。不用把list、string或array直接传参进来;只要传它的size即可。返回 index 。 | IndexOutOfBoundsException |
checkPositionIndex(int index, int size) | 检查参数 index 是否是给定size的list或string、array等的合法position。一个合法position必须>=0且<=size。不用把list、string或array直接传参进来;只要传它的size即可。返回 index 。 | IndexOutOfBoundsException |
checkPositionIndexes(int start, int end, int size) | 检查参数构成的 [start, end) 是给定size的list或string、array等得合法子集。抛出exception时带有自己的错误信息。 | IndexOutOfBoundsException |
相比一些其他组件,如Apache Commons中的comparable utilities,我们更倾向于用我们自己的前置条件检查,主要有以下原因。Piotr Jagielski 简短阐述了他为什么选择我们的utilities:
- 使用静态import之后,Guava的方法是清晰而无歧义的。checkNotNull 清楚地表示了它是做什么的,以及可能抛出哪个exception。
- checkNotNull 在验证后把参数直接返回,因此在构造函数中可以简单地写为一行: this.field = checkNotNull(field) 。
- 简单地,可加参数的"printf风格" exception信息。 (这个优势也是我们建议继续使用 checkNotNull ,而不换用JDK 7中的Objects.requireNonNull 的原因。)
我们建议把每项前置条件检查代码写在不同的行中,这样在debug的时候你就能看出是哪一项没通过了。另外,你应该附上有意义的错误信息,因此每个检查独立一行会方便一些。
中文翻译自Guava官方文档:GuavaExplained - PreconditionsExplained 译者:戴仓薯