在@EqualsAndHashCode 和@ToString 中只使用callsuper 的更好方法?

Better way to only use callsuper in @EqualsAndHashCode and @ToString?

我有 class 继承了一些字段,其中包括我的 id 字段和我为对象区分的字段。 我正在使用 lombok 生成我的@EqualsAndHashCode 和@ToString,但只想使用我的超级 class 版本,并排除我的 class 中的所有字段。 我想知道是否有办法做到这一点,而不使用排除然后添加所有字段。

我的class是:

@EqualsAndHashCode(of = { "id" })
@ToString(of = { "id", "email", "name" })
@Data
public abstract class Resource {
    @Id
    private Integer id;

    private String name;

    private String email;
}

@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Data
public class Employee extends Resource {
    private Organisation organisation;

    private List<Skill> skills = new ArrayList<Skill>();
}

在这里,我将获得 ToString、Equals 和 HashCode 方面的组织和技能。

要排除它们,我可以使用:

@ToString(callSuper = true, exclude = { "organisation", "skills" })

然而,由于我的字段比示例更多,并且将来可能会有更多,我希望我可以排除所有字段,除了我的超级 class。

我还可以用 of = {} 添加一个字段。

有没有更好的方法可以做到这一点?

不会

@ToString(callSuper = true, of = {})

工作? Lombok 对超类字段一无所知(因为此信息在它运行时不可用)并且您不能包含 id 或排除 name。你所能做的就是让它调用super.toString()。当您根本不包含任何字段时,您会得到类似

的内容
Employee(super=Resource(43, Larvalis, larvalis@somewhere.com))

这可能是您想要的,也可能不是。你可以改写

public String toString() {
    return getClass().getSimpleName()
        + super.toString().replaceFirst("^[^(]+", "");
}

所以你会得到

Employee(43, Larvalis, larvalis@somewhere.com)

更新:

同时 of 参数已过时,请参阅@Datz 的回答中的 onlyExplicitlyIncluded

我建议在基础 class 的 id 字段上使用 @ToString.Include / @EqualsAndHashCode.Include 以及 class 注释@ToString(onlyExplicitlyIncluded = true) / @EqualsAndHashCode(onlyExplicitlyIncluded = true):

@ToString(onlyExplicitlyIncluded = true)
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public abstract class Resource {
    @Id
    @ToString.Include
    @EqualsAndHashCode.Include
    private Integer id;
    ...

您可以在 child class(es) 上使用 @ToString(callSuper = true, onlyExplicitlyIncluded = true) / @EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true):

@ToString(callSuper = true, onlyExplicitlyIncluded = true)
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
public class Employee extends Resource {
    ...

优点:

  • 无需显式设置注释默认值 (of = {}) (参见@maaartinus 的回答)
  • 你不能忘记更新 of = {...} / included = {...}lists
  • 中的字段列表
  • 您避免使用 of 注释属性,该属性可能很快就会被弃用(请参阅 Javadoc)。