在前一篇 Scala 的参数检查与断言: require, assert, assume 和 ensuring,捉摸 Scala 的断言时提到了 JDK 内置对断言的粗略支持,也就是 assert
语句,并且默认该特性是被关掉,需 -ea
开启。
assert object != null;
assert object != null : "object can't be null";
还进一步接触了 Scala 的 Predef
方法 require
, assert
, assume
, 和 ensuring
是怎么检验参数与断言运算结果的,Scala 的这些方法在校验失败时相应的抛出 IllegalArgumentException
和 AssertionError
异常。
JDK 7 引入了 Objects 工具类,它的三个 T requireNotNull(T object)
方法能对参数进行 null 值检查,null 时抛出 NullPointerException
可是我认为这个 requireNotNull()
对我们帮助其实不大,NullPointerException
的抛出只不过是早晚的事。我们更迫切需要一个像 Scala 那样的 require
, assert
等方法,很幸运 Google 的 Guava 库为我们发明了这个轮子,那就是 Guava 的 Preconditions, 而且它比之 Scala 的处理方式来说有更完善的语义。它在断言运算结果时摒弃了含糊的 AssertionError
错误,代之以 java.lang.IllegalStateException
异常,说明运算的结果并预期(非法的状态)。
由上图可知,Preconditions(点击查看它的源码) 的方法包括四大类:
- checkArgument(boolean expression, ...): 校验参数,失败则抛出
java.lang.IllegalArgumentException
- checkState(boolean expression, ...): 检验中间结果,失败则抛出
java.lang.IllegalStateException
, 语义上比AssertionError
要准确 - checkNotNull(T reference, ...): 和
Objects.requireNotNull(T Objejct)
功能一样,失败也是抛出java.lang.NullPointerExeption
, 成功则得到被校验的值。可用这个方法替代 Objects 中的相应方法。 - checkXxxIndex(): 这类方法用得较少,检验是否为集合的有效索引,失败则抛出
IndexOfOfBoundsException
来个类似于上篇的的简单例子吧:
1 2 3 4 5 6 7 8 9 10 11 12 |
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; ........ public void register(String name) { checkArgument(name != null && !name.toLowerCase().equals("admin"), "name[%s] can't be null or 'admin'", name); int id = findIdByName(name); checkState(id == null, "Duplicated name[%] with id[%s]", name, id); ...... } |
本文链接 https://yanbin.blog/java-assertion-guava-preconditions/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
[…] Java 的参数检查与断言 介绍了在 Java 中如何应用 Guava 的 Preconditions […]