紧凑等于和哈希码

时间:2014-03-14 16:35:59

标签: java eclipse

我有一个有4个属性的bean:

user
institutionId
groupId
postingDate

我使用Eclipse生成equals和hashcode,但结果代码并不漂亮。是否有一种紧凑的方式来做同样的事情?假设我想要等于& hashcode使用所有属性或其子集。

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((groupId == null) ? 0 : groupId.hashCode());
    result = prime * result + ((institutionId == null) ? 0 : institutionId.hashCode());
    result = prime * result + ((postingDate == null) ? 0 : postingDate.hashCode());
    result = prime * result + ((user == null) ? 0 : user.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    ManGroupKey other = (ManGroupKey) obj;
    if (groupId == null) {
        if (other.groupId != null)
            return false;
    } else if (!groupId.equals(other.groupId))
        return false;
    if (institutionId == null) {
        if (other.institutionId != null)
            return false;
    } else if (!institutionId.equals(other.institutionId))
        return false;
    if (postingDate == null) {
        if (other.postingDate != null)
            return false;
    } else if (!postingDate.equals(other.postingDate))
        return false;
    if (user == null) {
        if (other.user != null)
            return false;
    } else if (!user.equals(other.user))
        return false;
    return true;
}

6 个答案:

答案 0 :(得分:6)

在Java 7中


public int hashCode() {
    return Objects.hash(groupId, institutionId, postingDate, user);
}


public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;

    // cast to correct class
    Target o = (Target)obj;

    return Objects.equals(groupId, o.groupId) &&
           Objects.equals(institutionId, o.institutionId) &&
           Objects.equals(postingDate, o.postingDate) &&
           Objects.equals(user, o.user);
}

答案 1 :(得分:5)

你可以压缩代码,但是你引入错误的几率远高于你做任何有用的东西。等于和哈希码方法的所有部分都是有原因的。

如果困扰你,大多数IDE都有折叠编辑器,只需点击黄色小框(通常),方法的所有内容都会被隐藏起来。

答案 2 :(得分:4)

您可以使用Apache-common-langs(http://commons.apache.org/proper/commons-lang/)类HashCodeBuilder和EqualsBuilder来代替使用eclipse生成的代码:

public int hashCode() {
   return HashCodeBuilder.reflectionHashCode(this);
}


public boolean equals(Object obj) {
   return EqualsBuilder.reflectionEquals(this);
 }

答案 3 :(得分:2)

的hashCode:  之一:

@Override 
public int hashCode() {
    return Objects.hash(user, institutionId, groupId, postingDate);
}

或者:

@Override 
public int hashCode() {
    int result = 17;
    result = 31 * result + Objects.hashCode(user);
    result = 31 * result + Objects.hashCode(institutionId);
    result = 31 * result + Objects.hashCode(groupId);
    result = 31 * result + Objects.hashCode(postingDate);
    return result;
}

等于:

public boolean equals(Object obj){
    if (obj == this){
        return true;
    }
    if (! (obj instanceof ManGroupKey)){
        return false;
    }
    ManGroupKey other = (ManGroupKey) obj;
    return Objects.equals(user, other.user)
           && Objects.equals(institutionId, other.institutionId)
           && Objects.equals(groupId, other.groupId)
           && Objects.equals(postingDate, other.postingDate);
}

答案 4 :(得分:1)

您可以通过删除other.x != null支票来删除一级嵌套。

以这种方式比较值:当x.equals(y)false时,y将始终返回null

除此之外:.equals()方法是一个很好的例子,其中一些反射可以很方便,可能被提取到一个通用的实用方法中。您所要做的就是浏览不同的字段,看看它们在两个对象中是否相等,可以在几行中完成。

显然,这只有在您真正想要比较每个字段时才可行(或者您必须添加一些添加内容以便您选择字段)。

答案 5 :(得分:1)

我认为可以为你提供套件的库是常见的apache。它提供EqualsBuilderHashCodeBuilder类,完全符合您的要求。

请考虑此问题以获取详细信息:Apache Commons equals/hashCode builder

以下是一些代码段:

public class Bean{

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


    @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;
        }
    }
}