Java如何使用Apache Commons实现hashCode和equals方法?

此代码段向您展示了如何使用Apache Commons Lang库中的HashCodeBuilder和EqualsBuilder类来实现对象的hashCode()和equals()方法。要使用这两个类,我们只需要创建这些类的实例,并附加将使用计算哈希码并测试是否相等的属性即可。

hashCode()首先通过创建hashCode()方法来实现该方法。添加@Override注释,以确保我们已覆盖正确的方法。然后,我们创建一个HashCodeBuilder实例。附加我们将用于计算哈希码的字段。实际哈希码的最终结果可以通过toHashCode()从实例调用来获得HashCodeBuilder。

/**
 * Implement the hashCode method using HashCodeBuilder.
 */
@Override
public int hashCode() {
    return new HashCodeBuilder().append(id).append(name).toHashCode();
}

我们做同样的事情来创建equals()方法。首先创建方法,它采用的单个参数类型java.lang.Object。添加@Override批注以确保我们重写正确的方法。在第一行,您可以检查传递的对象是否是同一对象的实例,我们使用instanceof运算符。然后,我们使用EqualsBuilder该类比较存储在两个对象中的值。为了获得相等的结果,您必须记住调用该isEquals()方法。

/**
 * Implement the equals method using the EqualsBuilder.
 */
@Override
public boolean equals(Object obj) {
    if (!(obj instanceof DummyUser)) {
        return false;
    }
    DummyUser that = (DummyUser) obj;
    return new EqualsBuilder().append(this.id, that.id)
            .append(this.name, that.name).isEquals();
}

这是代码段的完整外观。

package org.nhooo.example.commons.lang;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

public class DummyUser {
    private Long id;
    private String name;

    /**
     * Constructor to create an instance of this class.
     */
    public DummyUser() {
    }

    public static void main(String[] args) {
        DummyUser user1 = new DummyUser();
        user1.setId(10L);
        user1.setName("Carol");

        DummyUser user2 = new DummyUser();
        user2.setId(10L);
        user2.setName("Carol");

        System.out.println("user1.hashCode() = " + user1.hashCode());
        System.out.println("user2.hashCode() = " + user2.hashCode());

        System.out.println("user1.equals(user2) = " + user1.equals(user2));
    }

    // Getters & Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * Implement the hashCode method using HashCodeBuilder.
     */
    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(id).append(name).toHashCode();
    }

    /**
     * Implement the equals method using the EqualsBuilder.
     */
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof DummyUser)) {
            return false;
        }
        DummyUser that = (DummyUser) obj;
        return new EqualsBuilder().append(this.id, that.id)
                .append(this.name, that.name).isEquals();
    }
}

我们的代码的结果是:

user1.hashCode() = 64902380
user2.hashCode() = 64902380
user1.equals(user2) = true

Maven依赖

<!-- https://search.maven.org/remotecontent?filepath=org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

Maven中央