在@EqualsAndHashCode 和@ToString 中只使用callsuper 的更好方法?
Better way to only use callsuper in @EqualsAndHashCode and @ToString?
我有 class 继承了一些字段,其中包括我的 id 字段和我为对象区分的字段。
我正在使用 lombok 生成我的@EqualsAndHashCode 和@ToString,但只想使用我的超级 class 版本,并排除我的 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" })
然而,由于我的字段比示例更多,并且将来可能会有更多,我希望我可以排除所有字段,除了我的超级 class。
我还可以用 of = {}
添加一个字段。
有没有更好的方法可以做到这一点?
不会
@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
。
我建议在基础 class 的 id 字段上使用 @ToString.Include
/ @EqualsAndHashCode.Include
以及 class 注释@ToString(onlyExplicitlyIncluded = true)
/ @EqualsAndHashCode(onlyExplicitlyIncluded = true)
:
@ToString(onlyExplicitlyIncluded = true)
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public abstract class Resource {
@Id
@ToString.Include
@EqualsAndHashCode.Include
private Integer id;
...
您可以在 child class(es) 上使用 @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)。
我有 class 继承了一些字段,其中包括我的 id 字段和我为对象区分的字段。 我正在使用 lombok 生成我的@EqualsAndHashCode 和@ToString,但只想使用我的超级 class 版本,并排除我的 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" })
然而,由于我的字段比示例更多,并且将来可能会有更多,我希望我可以排除所有字段,除了我的超级 class。
我还可以用 of = {}
添加一个字段。
有没有更好的方法可以做到这一点?
不会
@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
。
我建议在基础 class 的 id 字段上使用 @ToString.Include
/ @EqualsAndHashCode.Include
以及 class 注释@ToString(onlyExplicitlyIncluded = true)
/ @EqualsAndHashCode(onlyExplicitlyIncluded = true)
:
@ToString(onlyExplicitlyIncluded = true)
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public abstract class Resource {
@Id
@ToString.Include
@EqualsAndHashCode.Include
private Integer id;
...
您可以在 child class(es) 上使用 @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)。