@ToString
@ToString
无需启动调试器即可查看您的字段:只需让lombok为您生成一个toString
!
Overview
任何类定义可以使用@ToString
让 lombok 生成toString()
方法的实现。默认情况下,它会按顺序打印您的类名以及每个字段,并以逗号分隔。
通过将includeFieldNames
参数设置为true,您可以为toString()方法的输出添加一些清晰度(但也有一些长度)。
默认情况下,将打印所有非静态字段。如果要跳过某些字段,可以使用@ToString.Exclude
标注这些字段。或者,您可以使用@ToString(onlyExplicitlyIncluded = true)
标准确定要使用的字段,然后标记要包含的每个字段@ToString.Include
。
通过设置callSuper为true
,可以将超类实现toString
的输出包含到输出中。请注意,toString()
的默认实现java.lang.Object几乎毫无意义,因此除非您扩展另一个类,否则您可能不希望这样做。
您还可以在您的方法中包含方法调用的输出toString
。只能包含不带参数的实例(非静态)方法。为此,请使用@ToString.Include
标记方法。
您可以更改用于标识成员的名称@ToString.Include(name = "some other name")
,并且可以更改成员的打印顺序@ToString.Include(rank = -1)
。没有等级的成员被认为具有等级0,更高等级的成员被首先打印,并且相同等级的成员以它们在源文件中出现的相同顺序被打印。
With Lombok
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;
}
}
}
Vanilla Java
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) + ")";
}
}
Supported configuration keys:
lombok.toString.includeFieldNames = [true | false] (default: true)
通常,lombok会以形式为每个字段生成toString
响应的片段fieldName = fieldValue
。如果将此设置设置为false
,则lombok将省略该字段的名称,并只是部署所有字段值的逗号分隔列表。includeFieldNames
如果明确指定,注释参数优先于此设置。
lombok.toString.doNotUseGetters = [true | false] (default: false)
如果设置为true
,则lombok将直接访问字段,而不是在生成toString方法时使用getter(如果可用)。doNotUseGetters
如果明确指定,注释参数优先于此设置。
lombok.toString.callSuper = [call | skip | warn] (default: skip)
如果设置为call
,toString
则如果您的类扩展了某些内容,lombok将生成对超类实现的调用。如果设置为skip
,不会生成此类调用。如果设置为warn
,也不会生成此类调用,但lombok会生成警告以告知您。
lombok.toString.flagUsage = [warning | error] (default: not set)
如果配置, Lombok会将任何@ToString
用法标记为警告或错误。
Small print
如果存在任何toString
不带参数的方法,则无论返回类型如何,都不会生成任何方法,而是会发出警告,说明您的@ToString
注释不执行任何操作。你可以标记任何方法@lombok.experimental.Tolerate
来隐藏它们从lombok。
数组是通过打印的Arrays.deepToString
,这意味着包含自身的数组将导致StackOverflowErrors
。但是,这种行为与ArrayList
例如没有区别。
如果某个方法被标记为包含并且它与字段具有相同的名称,它将替换该字段的toString
输出(包含该方法,排除该字段,并在该字段将被打印的位置打印方法的输出)。
在lombok 1.16.22之前,可以使用注释的of
和exclude
参数完成包含/排除@ToString
。这种旧式包含机制仍然受支持,但将来会被弃用。
同时具有@ToString.Exclude
和@ToString.Include
成员上生成一个警告; 在这种情况下,会员将被排除在外。
我们不保证toString()
在lombok版本之间保持生成的方法的输出相同。你永远不应该设计你的API,以便其他代码被迫解析你的toString()
输出!
默认情况下,任何以$符号开头的变量都会自动排除。您只能使用@ToString.Include
注释包含它们。
如果存在要包含的字段的getter,则调用它而不是使用直接字段引用。可以抑制此行为:
@ToString(doNotUseGetters = true)
@ToString
也可以用于枚举定义。