我刚刚在 Effective Java 中读到,equals()
方法的第五个原则是所有对象都必须不等于null
. 这本书接着说,程序员编写的一些类使用显式测试来防止这种情况null
:
public boolean equals(Object o){
if (o == null)
return false;
...
}
根据 Effective Java,上述非空测试是不必要的。但是,我的问题是,为什么这么多程序员要测试这个非空性要求呢?
您可以通过instanceof
测试来做到这一点:
public boolean equals(Object o){
if (!(o instanceof MyObject))
return false;
...
}
null
不是任何东西的实例,所以这有效。
Object firstObject = null;
secondObject.equals(firstObject);
你怎么能防止这种情况?如果您在使用前不检查 null ,那么它将崩溃。我认为您还需要检查类类型,如下所示
if (other == null || other.getClass() != this.getClass()) {
return false;
}
检查的可能原因:
其他语言的旧习惯
不熟悉你说的原理
可能抛出空指针异常的库(你不能保证其他人没有做过愚蠢的事情!)
如果您有一些嵌套命令只需要针对对象的非空实例进行评估,您可能想要绕过
防止调用NullPointerException
when 。equals()
行业中建议了许多做法,以避免代码中不必要的检查或陷阱,但事实上可能会发生错误或可能存在无法控制的情况,例如来自某些第三方系统的数据缺少系统所期望的值,因此需要检查。世界并不完美!!