【问题标题】:Better way to only use callsuper in @EqualsAndHashCode and @ToString?仅在@EqualsAndHashCode 和@ToString 中使用callsuper 的更好方法?
【发布时间】:2018-01-03 06:04:00
【问题描述】:

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

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

【问题讨论】:

  • 很久没用lombock了。但是您可以从员工类中删除注释。这样你的类中就没有 equlas 和 toString 并且 super 被自动调用
  • 没错,我使用@data 来获取一些额外的东西,但如果我删除数据并添加@Getter@Setter,它会提供更清晰的视图,即主要目标 :) 干杯

标签: java inheritance tostring lombok


【解决方案1】:

不会简单

@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

【讨论】:

  • 是的,不知何故,我已经进入我的脑海,我需要在 of = {} 中至少有一个字段。解决方案通常比您想象的要简单:/
  • 事实上,显式设置默认值of = {} 似乎很奇怪——但是,是的,这个解决方案是必要的。 (对于 equals/hashcode 方法也是如此。)。我发布了另一个不使用 of 属性的解决方案,该属性很快将被弃用(参见 projectlombok.org/api/lombok/ToString.html#of() )。
【解决方案2】:

我建议在基类的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 = {...}lists 中的字段列表
  • 避免使用of 注释属性,该属性可能很快就会被弃用(参见 Javadoc)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多