我很想知道,这里的人对使用

推荐答案

commons/lang构建器非常棒,我已经使用了多年,没有明显的性能开销(有或没有hibernate).但正如阿兰所写的那样,番石榴的做法甚至更好:

下面是一个示例Bean:

public class Bean{

    private String name;
    private int length;
    private List<Bean> children;

}

下面是用Commons/Lang实现的equals()和hashCode():

@Override
public int hashCode(){
    return new HashCodeBuilder()
        .append(name)
        .append(length)
        .append(children)
        .到HashCode();
}

@Override
public boolean equals(final Object obj){
    if(obj instanceof Bean){
        final Bean other = (Bean) obj;
        return new EqualsBuilder()
            .append(name, other.name)
            .append(length, other.length)
            .append(children, other.children)
            .isEquals();
    } else{
        return false;
    }
}

以下是Java 7或更高版本(受番石榴启发):

@Override
public int hashCode(){
    return Objects.hash(name, length, children);
}

@Override
public boolean equals(final Object obj){
    if(obj instanceof Bean){
        final Bean other = (Bean) obj;
        return Objects.equals(name, other.name)
            && length == other.length // special handling for primitives
            && Objects.equals(children, other.children);
    } else{
        return false;
    }
}

注意:这段代码最初引用了Guava,但正如 comments 所指出的,这个功能已经在JDK中引入,所以Guava不再是必需的.

如您所见,Guava/JDK版本更短,并且避免了多余的辅助对象.在相等的情况下,如果较早的Object.equals()调用返回False,它甚至允许短路计算(公平地说:Commons/Lang有一个具有相同语义的ObjectUtils.equals(obj1, obj2)方法,可以使用该方法代替EqualsBuilder来允许如上所述的短路).

因此:是的,Commons Lang构建器比手动构造的equals()hashCode()方法(或者Eclipse将为您生成的那些可怕的怪物)更可取,但是Java7+/Guava版本甚至更好.

还有一条关于Hibernate的注释:

在equals()、hashCode()和到String()实现中使用惰性集合时要小心.如果你没有一个公开的会议,那将是惨败的.


注(关于equals()):

a) 在上述equals()的两个版本中,您可能还希望使用以下一个或两个快捷方式:

@Override
public boolean equals(final Object obj){
    if(obj == this) return true;  // test for reference equality
    if(obj == null) return false; // test for null
    // continue as above

b)根据您对equals()合同的解释,您还可以更改行

    if(obj instanceof Bean){

    // make sure you run a null check before this
    if(obj.getClass() == getClass()){ 

If you use the second version, you probably also want 到 call super(equals()) inside your equals() method. Opinions differ here, the 到pic is discussed in this question:

right way 到 incorporate superclass in到 a Guava Objects.hashcode() implementation?

(although it's about hashCode(), the same applies 到 equals())


Note (inspired by Comment from 100)

如果有许多基本字段,Objects.hashCode(..)(与底层Arrays.hashCode(...)一样)可能会表现不佳.在这种情况下,EqualsBuilder实际上可能是更好的解决方案.

Java相关问答推荐

在正确位置绘制多边形的PFA问题

LocalTime解析截断时间的第二个值

一般类型和kotlin阴影Java函数的问题

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

Java 8中的多个字段和计数

为什么JAVA&S清洁器使用链表而不是并发HashSet?

放气总是压缩整个街区吗?

GSON期间的Java类型擦除

将响应转换为带值的键

try 在Android Studio中的infoWindow中使用EditText(Java)

有效的公式或值列表必须少于或等于255个字符

为什么在下面的Java泛型方法中没有类型限制?

寻找Thread.sky()方法的清晰度

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

在一行中检索字符分隔字符串的第n个值

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

当我try 返回可选时,Mock无法正常工作