我知道不可能像这样在空对象上调用 equals 方法:
//NOT WORKING
String s1 = null;
String s2 = null;
if(s1.equals(s2))
{
System.out.println("NOT WORKING :'(");
}
但就我而言,我想比较两个数据库中的两个对象,这两个对象的属性可以为 null...
那么什么是比较两个属性的方法,知道我们不确定值是null还是填充。
这个方法好不好?
//WORKING
String s1 = "test";
String s2 = "test";
if(s1 == s2 || s1.equals(s2))
{
System.out.println("WORKING :)");
}
//WORKING
String s1 = null;
String s2 = null;
if(s1 == s2 || s1.equals(s2))
{
System.out.println("WORKING :)");
}
我不确定,因为在这种情况下它不起作用......:
//NOT WORKING
String s1 = null;
String s2 = null;
if(s1.equals(s2)|| s1 == s2 )
{
System.out.println("NOT WORKING :'''(");
}
最佳答案
我通常使用我编写的名为 equalsWithNulls
的静态实用程序函数来解决此问题:
class MyUtils {
public static final boolean equalsWithNulls(Object a, Object b) {
if (a==b) return true;
if ((a==null)||(b==null)) return false;
return a.equals(b);
}
}
用法:
if (MyUtils.equalsWithNulls(s1,s2)) {
// do stuff
}
这种方法的优点:
- 在单个函数调用中总结了完全相等测试的复杂性。我认为这比每次执行此操作时都在代码中嵌入一堆复杂的 boolean 测试要好得多。因此导致错误的可能性要小得多。
- 使您的代码更具描述性,因此更易于阅读。
- 通过在方法名称中明确提及 null,您可以向读者传达他们应该记住一个或两个参数可能为 null。
- 是否首先进行 (a==b) 测试(在 a 和 b 不为空但引用完全相同的对象的相当常见情况下,无需调用 a.equals(b) 的优化)
关于Java null.equals(对象 o),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11011742/