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

Lar*_*lis 2 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>();
}
Run Code Online (Sandbox Code Playgroud)

在这里,我将获得ToString,Equals和HashCode的组织和技能.

为了排除它们,我可以使用:

@ToString(callSuper = true, exclude = { "organisation", "skills" })
Run Code Online (Sandbox Code Playgroud)

然而,因为我有更多的字段而不是示例,并且将来可能会有更多的字段,我宁愿我能排除除了超级类之外的所有字段.

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

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

maa*_*nus 5

不会简单

@ToString(callSuper = true, of = {})
Run Code Online (Sandbox Code Playgroud)

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

Employee(super=Resource(43, Larvalis, larvalis@somewhere.com))
Run Code Online (Sandbox Code Playgroud)

这可能是也可能不是你想要的.你可以改写

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

所以你会得到的

Employee(43, Larvalis, larvalis@somewhere.com)
Run Code Online (Sandbox Code Playgroud)

  • 实际上,显式设置默认值`of = {}`似乎很奇怪-但是,是的,此解决方案是必需的。(对于equals / hashcode方法相同。)。我发布了另一个不使用`of`属性的解决方案,该属性将很快被弃用(请参阅https://projectlombok.org/api/lombok/ToString.html#of())。 (2认同)