我有一个类,我在其中继承一些字段,其中包括我的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 = {}
中添加一个字段。
有没有更好的方法可以做到这一点?
不会简单
@ToString(callSuper = true, of = {})
工作?龙目岛对超类字段一无所知(因为此信息在运行时不可用),并且您不能包含id
或排除name
。您所要做的就是将其称为super.toString()
。当您根本不包含任何字段时,您将得到类似的信息
Employee(super=Resource(43, Larvalis, [email protected]))
可能不是您想要的。您可以改写
public String toString() {
return getClass().getSimpleName()
+ super.toString().replaceFirst("^[^(]+", "");
}
所以你会得到
Employee(43, Larvalis, [email protected])
of
参数在此同时已过时,请参阅@Datz的答案中的onlyExplicitlyIncluded
。
我建议在基类的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 = {...}
列表中的字段列表of
批注属性,该属性可能很快就会被弃用(请参阅Javadoc)。