1

我正在开发一个基于 MySQL 库自动生成代码的项目。它有点像 JPA,但不完全是。

这是一个示例 bean:

public class TemplateBean implements Bean {
    private Integer templateId;
    private Integer businessPartnerId;

    public TemplateBean(final Integer businessPartnerId) {
        this.businessPartnerId = businessPartnerId;
    }

    private TemplateBean(final Object nullObject, final Integer templateId, final Integer businessPartnerId) {
        this.templateId = templateId;
        this.businessPartnerId = businessPartnerId;
    }

    public TemplateBean(final ResultSet rs) throws SQLException {
        this(null, rs.getInt(1), rs.getInt(2));
    }

    public Integer getTemplateId() {
        return templateId;
    }

    public void setTemplateId(final Integer templateId) {
        this.templateId = templateId;
    }

    public Integer getBusinessPartnerId() {
        return businessPartnerId;
    }

    public void setBusinessPartnerId(final Integer businessPartnerId) {
        this.businessPartnerId = businessPartnerId;
    }

    @Override
    public String toString() {
        return "Template(" + templateId + ", " + businessPartnerId + ")";
    }
}

现在我需要它来实现equals()hashCode(). 我当然可以访问 SQL 提供的所有数据,所以我认为实现equals()应该是可行的,但是我要如何创建一个好的hashCode()

任何提示将不胜感激。

4

2 回答 2

4

我想建议使用EqualsBuilder

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


public class Person {
    private String id;
    private String name;
    private String address;
    private String phone;
    private String version;

    @Override
    public boolean equals(Object object) {
        return EqualsBuilder.reflectionEquals(this, object,);
    }

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

    or

    /*
     * equal() method with exclude fields.
     * it will neglect id and version fields.
     * 
     * */
    @Override
    public boolean equals(Object object) {
        return EqualsBuilder.reflectionEquals(this, object, "id", "version");
    }
}
于 2013-07-23T10:14:43.463 回答
0

一种非常方便的方法是使用 Groovy 提供的@EqualsAndHashCode注解。使用它就像

@EqualsAndHashCode
public class TemplateBean implements Bean {
  // implementation omitted
}

这将使用类似于《Effective Java》一书中概述的算法,根据类的属性生成equals()和方法。hashCode()

因为注解是通过 AST 转换实现的,所以它可以在 Java 或 Groovy 类中使​​用,尽管您当然需要类路径中的 Groovy 库才能使用它。

于 2013-07-23T10:27:23.723 回答