如何在日食中更新Java构造函数,等于,哈希等?

2022-09-04 03:36:31

我想知道是否有人知道在Java中由eclipse生成的更新,构造函数,等于,哈希,字符串等的好方法。很多时候,在我使用自动生成的代码存根后,我向类中添加一个成员变量,然后我需要删除自动生成的代码,然后重新执行。有没有办法让 eclipse 将新变量添加到自动生成的代码存根中?

编辑:好的删除不是必需的,但是我仍然必须去生成它们中的每一个,我正在寻找一个自动解决方案。


答案 1

这并不是你问题的解决方案,但我不再使用Eclipse自动生成的方法,我使用Apache commons lang EqualsBuilderHashCodeBuilder

因此,例如,您可以执行以下操作:

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

public class EqualsTest {
    private String foo;
    private int bar;

    // getters and setters

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this);
    }

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

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

这使用反射,并且在添加字段时不需要更改。但是,还有其他选项可以指定要使用的字段,以及是否也要考虑超类的哈希代码。

编辑:正如已经指出的那样,这种反映方面可能会有一些相关的性能损失。就个人而言,我在生产代码中不使用反射HashCodeBuilder或EqualsBuilder,我使用toHashCode(如下所示)。但是,我确实使用ReflectiveToStringBuilder进行日志记录等。

下面是一个不使用反射的示例,但要求您在添加字段时添加另一行:

public int hashCode() {
  // you pick a hard-coded, randomly chosen, non-zero, odd number
  // ideally different for each class
  return new HashCodeBuilder(17, 37).
    append(foo).
    append(bar).
    toHashCode();
}

有关hashCodeBuilder的更多讨论,请参阅apache commons equals/hashcode builder。


答案 2

看看 www.projectlombok.org 作为自己编写这些方法的替代方法。特别是@Data注释似乎符合您的需要,请参阅 http://www.projectlombok.org/features/Data.html


推荐