我有一个方法,它接收一个对象的Set
。它委托给的一个方法要求Set
中不包含任何空元素。我想在委托之前在该方法中检查前置条件,即确保Set
不包含任何空元素。明显的代码是:
public void scan(Set<PlugIn> plugIns) {
if (plugIns == null) {
throw new NullPointerException("plugIns");
} else if (plugIns.contains(null)) {
throw new NullPointerException("plugIns null element");
}
// Body
}
但是这是不正确的,因为
Set.contains()
可能会抛出 NullPointerException
,如果 Set
实现本身不允许空元素。在这种情况下捕获并忽略 NullPointerException
将起作用 但不优雅。有没有一种简洁的方法来检查这个前提条件?
< p >
Set
接口中是否存在设计缺陷?如果一个 Set
实现可能永远不包含 null,为什么不要求 Set.contains(null)
总是返回 false
呢?或者使用 isNullElementPermitted()
谓词?
Set
创建你的类,但是要根据你的类合同确保它不包含null
。然后,如果有人实际上传递了一个不允许null
的Set
,你的安全contains
检查会抛出NPE,因为它在规范中。在我看来,这是设计错误,因为调用者无法做任何事情(即,无法询问Set是否允许null),更不用说在这种情况下抛出NPE似乎很愚蠢,而不是返回false
。 - john16384