-
Notifications
You must be signed in to change notification settings - Fork 1
@ToString
任何类定义都可以用 @ToString
注解,让lombok生成toString()
方法的实现。默认情况下,它会按顺序打印你的类名称以及每个字段,并以逗号分隔。
通过将 includeFieldNames
参数设置为 true
,你可以为toString()
方法的输出添加一些清晰度(但也增加了一些长度)。
默认情况下,将打印所有非静态字段。如果要跳过某些字段,可以使用 @ToString.Exclude
注释这些字段。或者,你可以使用 @ToString(onlyExplicitlyIncluded = true)
准确指定要使用的字段,然后使用 @ToString.Include
标记要包含的每个字段。
通过将 callSuper
设置为 true
,可以将 toString
的超类实现的输出包含到子类输出中。请注意,java.lang.Object
中 toString()
的默认实现几乎没有意义,因此除非你继承另一个类,否则你可能不希望这样做。
你还可以在 toString
中包含方法调用的输出。只能包含不带参数的实例(非静态)方法。为此,请使用 @ToString.Include
标记方法。
你可以使用 @ToString.Include(name = "some other name")
更改用于标识成员的名称,并且可以通过 @ToString.Include(rank = -1)
更改成员的打印顺序。没有rank的成员被认为rank=0,rank值更高的成员被首先打印,并且相同rank值的成员以它们在源文件中出现的顺序被打印。
import lombok.ToString;
@ToString
public class ToStringExample {
private static final int STATIC_VAR = 10;
private String name;
private Shape shape = new Square(5, 10);
private String[] tags;
@ToString.Exclude private int id;
public String getName() {
return this.name;
}
@ToString(callSuper=true, includeFieldNames=true)
public static class Square extends Shape {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
}
}
import java.util.Arrays;
public class ToStringExample {
private static final int STATIC_VAR = 10;
private String name;
private Shape shape = new Square(5, 10);
private String[] tags;
private int id;
public String getName() {
return this.getName();
}
public static class Square extends Shape {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
@Override public String toString() {
return "Square(super=" + super.toString() + ", width=" + this.width + ", height=" + this.height + ")";
}
}
@Override public String toString() {
return "ToStringExample(" + this.getName() + ", " + this.shape + ", " + Arrays.deepToString(this.tags) + ")";
}
}
lombok.toString.includeFieldNames
= [ true
| false
](默认值:true)
通常,lombok以 fieldName = fieldValue
的形式为每个字段生成 toString
响应的片段。如果此设置设置为 false
,则lombok将省略该字段的名称,只需打印所有字段值的逗号分隔列表。如果明确指定,注解参数 includeFieldNames
优先于此设置。
lombok.toString.doNotUseGetters
= [ true
| false
](默认值:false)
如果设置为 true
,则在生成 toString
方法时,lombok 将直接访问字段,而不是使用getter(如果可用)。如果明确指定,注释参数 doNotUseGetters
优先于此设置。
lombok.toString.callSuper
= [ call
| skip
| warn
](默认值:skip)
如果设置为 call
,如果你的类扩展了其他类,lombok 将生成对超类 toString
实现的调用。如果设置为 skip
,则不会生成这个调用。如果设置为 warn
,则不会生成这个调用,但是lombok会生成警告来告知你。
lombok.toString.flagUsage
= [ warning
| error
](默认:未设置)
如果已配置,Lombok会将 @ToString
的任何用法标记为警告或错误。
如果存在任何名为 toString
且没有参数的方法,则无论返回类型如何,都不会生成方法,而是会发出警告,说明你的 @ToString
注解不执行任何操作。你可以使用 @lombok.experimental.Tolerate
标记任何方法以将其隐藏在 lombok 中。
数组通过 Arrays.deepToString
打印,这意味着包含自身的数组将导致 StackOverflowError
s。但是,这种行为类似于 ArrayList
。
如果某个方法被标记为包含并且它与字段具有相同的名称,则它将替换该字段的 toString
输出(包含该方法,排除该字段,并在原来字段将被打印的位置打印方法的输出)。
在lombok 1.16.22之前,可以使用 @ToString
注解的 of
和 exclude
参数完成包含/排除。现在仍然支持这种旧式包含机制,但将来会被弃用。
在成员上同时使用 @ToString.Exclude
和 @ToString.Include
会生成警告;在这种情况下,成员将被排除在外。
我们不保证在 lombok 版本之间保持生成的 toString()
方法的输出相同。你永远不应该依赖ToString()
设计你的API,导致其他代码强制解析你的 toString()
输出!
默认情况下,任何以 $
符号开头的变量都会自动排除。你只能使用 @ToString.Include
注解包含它们。
如果存在要包含的字段的getter,则调用它而不是直接使用字段引用。此行为可以被抑制:
@ToString(doNotUseGetters = true)
@ToString
也可用于枚举定义。
我增加了一些示例,详见代码