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

标签 java inheritance tostring lombok

我有一个类,我继承了一些字段,其中包括我的 id 字段和我对对象的不同字段。 我正在使用 lombok 生成 @EqualsAndHashCode 和 @ToString,但只想使用我的父类(super 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" })

但是,由于我的字段比示例更多,并且将来可能会更多,因此我希望能够排除除父类(super class)之外的所有字段。

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

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

最佳答案

不简单

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

工作? Lombok 对父类(super class)字段一无所知(因为此信息在运行时不可用),并且您不能包含 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

关于java - 仅在 @EqualsAndHashCode 和 @ToString 中使用 callsuper 的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45351967/

相关文章:

java - 多个 QueueConnectionFactory 上的异常

python - 覆盖 Python 中的特殊函数

java - ToStringBuilder append X appendSuper

java.sql.SQLException : I/O Error: SSO Failed: Native SSPI library 异常

java - 如何生成具有不同数量符号的字符串掩码?

java - 使用 javassist 修改在类构造函数中使用 getter 和 setter 的字段

java - 如何在对象中创建 toString 方法?

c++ - 如果不是手动完成,子类是否会继承父类的析构函数?

python - Python中的继承和内部类?

java - 从类名生成的 toString() 文本