我有一个课程,我在那里继承了一些字段,其中包括我的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 = {}
添加一个字段。
有没有更好的方法来实现这一目标?
答案 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)。