为何SetN的contains方法不允许传入null参数?
为什么ImmutableCollections的contains方法要调用Objects.requireNonNull(o)?
先看对应的代码实现:
@Override public boolean contains(Object o) { Objects.requireNonNull(o); return size > 0 && probe(o) >= 0; }
这个空指针检查的存在,核心原因是这类不可变Set的设计契约:不允许存储null元素,同时也拒绝任何和null相关的查询操作。
具体来说:
- 既然该集合本身根本不会存储null值,理论上
contains(null)的结果必然是false,但这里直接抛出NullPointerException,是为了明确告知开发者这个集合的边界——它不支持任何null相关的操作,不管是添加还是查询。 - 这种“提前失败”的设计能快速暴露错误,避免开发者误以为可以用
contains(null)来试探任意Set是否允许null元素:比如HashSet允许存null,调用contains(null)会正常返回结果,但这类不可变Set会直接抛出异常,两者行为完全不同。 - 对不可变集合而言,拒绝null参数也是在强化其不可变、无副作用的特性,从根源上杜绝null可能带来的潜在问题。
总结来说,这个检查是合理的——不同Set实现对null的支持不同,不可变Set选择彻底拒绝null,通过requireNonNull明确契约,避免开发者踩坑。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

