当前位置: 首页 > 面试题库 >

Apache Commons等于/ hashCode构建器

翟奕
2023-03-14
问题内容

我很好奇,这里的人们对使用org.apache.commons.lang.builder EqualsBuilder/
HashCodeBuilder 实施equals/有hashCode什么看法
?比编写自己的方法更好的做法吗?它与Hibernate配合使用是否很好?你怎么看?


问题答案:

commons / lang构建器很棒,我使用它们已有多年了,而没有明显的性能开销(带有和不带有hibernate状态)。但正如Alain所写,番石榴的方法更好:

这是一个示例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)
        .toHashCode();
}

@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或更高版本(受Guava启发):

@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,但正如注释所指出的那样,此功能自JDK中引入以来,因此不再需要Guava。

如您所见,Guava / JDK版本较短,并且避免了多余的辅助对象。在相等的情况下,如果更早的Object.equals()调用返回false,它甚至可以使评估短路(公平地说:commons / lang有一种ObjectUtils.equals(obj1,obj2)具有相同语义的方法,可以用来代替EqualsBuilder上面的短路)。

所以:是的,与手动构建的方法equals()hashCode()方法(或Eclipse将为您生成的那些可怕的怪物)相比,公共语言生成器更可取,但是Java7+ / Guava版本更好。

还有关于hibernate的说明:

请注意在equals(),hashCode()和toString()实现中使用惰性集合。如果您没有公开的会议,那将惨遭失败。

注意(关于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()){

如果使用第二个版本,则可能还需要super(equals())equals()方法内部进行调用。意见分歧在此,在此问题中讨论主题:

将超类合并到GuavaObjects.hashcode()实现中的正确方法?

(尽管大约是hashCode(),这也适用于equals()

注意(灵感来自kayahr的评论)

Objects.hashCode(..)``Arrays.hashCode(...)如果您有许多原始字段,则(与底层一样)的性能可能会很差。在这种情况下,EqualsBuilder实际上可能是更好的解决方案。



 类似资料:
  • } ========================================================================================== 我希望HashSet调用equal方法,因为重写了hashCode。在equals compare之后,我想删除我要传递到hashSet的集合中的重复项。 在控制台中,它将我打印出来,为true(因为在equals

  • 问题内容: 输出为: 这种“获取”方法的行为如何?由于m1和M2都具有相同的值,并且我没有重写hashcode(),因此将调用对象类的equals()方法吗? 这样对吗 ? 没有哈希码方法,因此JVM无法查看对象m1和m2是否包含不同的值 没有覆盖equals的方法,因此调用了Object类的equals(),并且由于两个对象都不相同,因此上面的代码可以很好地工作,而无需m2替换m1的值。 问题答

  • 问题内容: 我正在尝试使用Java从XSD文件中以编程方式生成JAXB类。我使用以下代码片段实现了这一目的: 生成的类仅包含字段的方法。但是,我想包括,和方法为好。生成代码时该怎么做? 问题答案: 在GitHub网站上,您将找到JAXB2 Basics项目 ,该项目提供了一组通用的实用程序插件,其中包括4个应解决您要实现的目标的插件: 等于插件 HashCode插件 二传手插件 ToString插

  • 问题内容: 我在为自己创建的类编写方法时遇到了麻烦。此类旨在在TreeSet中使用,因此,它实现Comparable。该类具有以下变量: 这是该方法的实现。我希望按其成本来组织这些Node结构,因此,返回简单减法的结果。 我还实现了一种方法。 说了这么多,我有几个问题: 由于实施了新方法,因此应该实施新方法吗? 如何使用这些变量实施新的hashCode ?(请注意,Matrix类型的变量矩阵已实现

  • 问题内容: 使用a 提供一个custom很简单,从而覆盖了添加到地图的对象所提供的语义。但是不能以这种方式控制;提供哈希值和相等性检查的函数不能“侧加载”。 我怀疑设计一个接口并将其改造成(或一个新类)既简单又有用?像这样的东西,除了名字更好: 在不区分大小写Map的问题得到了平凡解: 这是可行的,还是您会看到这种方法的任何基本问题? 现有(非JRE)库中是否使用了这种方法?(尝试过Google,

  • Spring boot maven插件正在使用paketo builder构建图像。 我想做的是在这个构建器正在做的事情上添加另一个步骤。我已经创建了自己的构建包,并试图创建包含基本构建包的构建器。 我遇到的第一个问题是,当试图从builder.toml创建一个构建器时,会出现这样的错误: 另一个问题是,即使这样做有效,我想我仍然必须指定来自paketo:base的所有order.group。 是