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

问题描述 投票:2回答:2

我有一个类,我在其中继承一些字段,其中包括我的id字段和那些我为该对象区分的字段。我正在使用lombok生成我的@EqualsAndHashCode和@ToString,但只想使用我的超类的版本,并排除类中的所有字段。我想知道是否有一种方法可以执行此操作,而无需使用排除然后添加所有字段。

我的班级:

@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" })

但是,尽管我的字段比示例更多,并且将来可能还会更多,但是如果我可以排除超类中的所有字段,我希望将其排除。

我也可以在of = {}中添加一个字段。

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

java inheritance tostring lombok
2个回答
5
投票

不会简单

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

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

Employee(super=Resource(43, Larvalis, [email protected]))

可能不是您想要的。您可以改写

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

所以你会得到

Employee(43, Larvalis, [email protected])

更新:

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


0
投票

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

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

您可以在子类上使用@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 = {...}列表中的字段列表
  • 您避免了of批注属性,该属性可能很快就会被弃用(请参阅Javadoc)。
© www.soinside.com 2019 - 2024. All rights reserved.