首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动代码生成过程中的Java equals()和hashcode()

自动代码生成过程中的Java equals()和hashcode()
EN

Stack Overflow用户
提问于 2013-07-23 18:09:54
回答 2查看 200关注 0票数 1

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

这是一个示例bean:

代码语言:javascript
复制
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()呢?

任何建议都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-23 18:14:43

我建议使用EqualsBuilder

代码语言:javascript
复制
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");
    }
}
票数 4
EN

Stack Overflow用户

发布于 2013-07-23 18:27:24

一种非常方便的方法是使用Groovy提供的@EqualsAndHashCode注释。使用它就像这样简单

代码语言:javascript
复制
@EqualsAndHashCode
public class TemplateBean implements Bean {
  // implementation omitted
}

这将基于类的属性生成equals()hashCode()方法,使用的算法与高效Java一书中概述的算法类似。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17807213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档