我正在学习JDK8的AbstractQueuedSynchronizer
的源代码,我不知道'null check'的目的:
/**
* Returns previous node, or throws NullPointerException if null.
* Use when predecessor cannot be null. The null check could
* be elided, but is present to help the VM.
*
* @return the predecessor of this node
*/
final Node predecessor() throws NullPointerException {
Node p = prev;
if (p == null)
throw new NullPointerException();
else
return p;
}
这些注释告诉我们可以省略空检查,但是有助于VM - 为什么? VM有什么好处?
从设计的角度来看,当您编写API时,最好将处理未定义行为的责任传递给用户,而不是尝试自己处理它。
在评论中,它说你应该只使用predecessor()
,因为它不能是null
,因此它检查以确保它不是null
- 但如果是,那么行为是未定义的,你应该通知用户。
也许JVM特有的东西对它有用,但是对它有更好了解的人将不得不谈论它。