我在equals
方法中发现这样的东西很烦人和丑陋:
if (field == null)
{
if (other.field != null)
return false;
}
else if ( ! field.equals(other.field))
return false;
在C#中,我可以做到这一点:
if( ! Object.Equals(field, other.field))
return false;
在Java中是否存在类似的东西,或者如果是这样的话,首选的方法是什么?
答案 0 :(得分:38)
Java 7提供java.util.Objects.equals。
答案 1 :(得分:23)
使用commons-lang:
org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2)
源代码:
public static boolean equals(Object object1, Object object2) {
if (object1 == object2) {
return true;
}
if ((object1 == null) || (object2 == null)) {
return false;
}
return object1.equals(object2);
}
来自Apache
http://commons.apache.org/lang/
这与您在C#中所做的相同。
答案 2 :(得分:6)
Guava equal这样做:
public static boolean equal(@Nullable Object a, @Nullable Object b) {
return a == b || (a != null && a.equals(b));
}
Guava也有一些相关的comparison chain和一些其他goodies。
答案 3 :(得分:4)
我会这样写:
return field != null && other.field != null && field.equals(other.field);
不像C#代码行那么优雅,但比你发布的if树短得多。
答案 4 :(得分:2)
我在技术上接受所有答案。实际上我不会在我控制的代码中使用它们中的任何一个,因为所有提供的解决方案都在解决核心问题:null-values。保持你的核心模型免于空值,在这种情况下问题已经过时了。
在第三方库等系统边界,有时必须处理空值。它们应该转换为核心模型的有意义的值。给定的解决方案很有帮助。
即使Oracle建议equals-Methods为null安全,请考虑一下:一旦接受了null值,你的模型就会变得脆弱。 equals-method不是检查null的最后一个方法。您必须在方法调用层次结构中管理空值检查。方法可能无法重新开箱即用。很快,每个参数都将被检查为空。
我看到了双方:
在一边充满了空检查的代码,不再信任单个参数的方法和不想忘记空检查的开发人员。
另一方面,代码具有完整的表达语句,使得有明确的断言可以使用可以使用的完整功能对象,而不必担心NullPointerExceptions。
答案 5 :(得分:1)
作为Project Coin的一部分,有一项建议是向Java添加一系列null-safe operators。可悲的是,他们没有把它变成Java 7,也许它们会出现在Java 8中。Here是关于它们如何工作的一般概念
答案 6 :(得分:1)
实际上每个人都有自己的方式来做这件事,我也想在这里介绍groovy。
有一种方法
field == null ? false : true;
//所以基本上当它不为空时它将返回true。
在groovy中,对象有null安全操作符。让我们为类
举个例子A {
String name = "test1"
String surName = "test2"
public String returnName() {
return name + surName
}
}
A a = null
a?.name
//提到的运算符?
实际上会检查a是否为null
。然后它将调用名称。
注意:我没有在代码中应用半冒号,因为在groovy中不需要。
答案 7 :(得分:0)
String.valueOf()将解决其中一些问题。如果指针为空,它将吐出toString()答案或“null”。
答案 8 :(得分:0)
在检查对象引用时使用==运算符,如果两个引用都引用相同的对象,则它将返回true。否则,如果您正在寻找对象内容,请使用.equals对象方法。
所以null意味着它没有在堆中给出的任何内存位置。因此可以使用'=='运算符进行简单检查。