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

时间:2017-07-27 13:17:14

标签: java inheritance tostring lombok

我有一个课程,我在那里继承了一些字段,其中包括我的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 = {}添加一个字段。

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:5)

不会简单地

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

答案 1 :(得分:3)

我建议在基类的 id 字段上使用@ToString.Include / @EqualsAndHashCode.Include和类注解@ToString(onlyExplicitlyIncluded = true) / @EqualsAndHashCode(onlyExplicitlyIncluded = true):< / p>

@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)。