Skip to content

@ToString

YellowStar5 edited this page Aug 8, 2019 · 2 revisions

@ToString

没必要启动debugger来查看你的字段:让 lombok来为你生成一个 ToString 方法吧!

概览

任何类定义都可以用 @ToString 注解,让lombok生成toString() 方法的实现。默认情况下,它会按顺序打印你的类名称以及每个字段,并以逗号分隔。

通过将 includeFieldNames 参数设置为 true,你可以为toString() 方法的输出添加一些清晰度(但也增加了一些长度)。

默认情况下,将打印所有非静态字段。如果要跳过某些字段,可以使用 @ToString.Exclude 注释这些字段。或者,你可以使用 @ToString(onlyExplicitlyIncluded = true) 准确指定要使用的字段,然后使用 @ToString.Include 标记要包含的每个字段。

通过将 callSuper 设置为 true,可以将 toString 的超类实现的输出包含到子类输出中。请注意,java.lang.ObjecttoString() 的默认实现几乎没有意义,因此除非你继承另一个类,否则你可能不希望这样做。

你还可以在 toString 中包含方法调用的输出。只能包含不带参数的实例(非静态)方法。为此,请使用 @ToString.Include 标记方法。

你可以使用 @ToString.Include(name = "some other name") 更改用于标识成员的名称,并且可以通过 @ToString.Include(rank = -1) 更改成员的打印顺序。没有rank的成员被认为rank=0,rank值更高的成员被首先打印,并且相同rank值的成员以它们在源文件中出现的顺序被打印。

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;
    }
  }
}

等价的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) + ")";
  }
}

支持的配置键

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 的任何用法标记为警告或错误。

Small print

如果存在任何名为 toString 且没有参数的方法,则无论返回类型如何,都不会生成方法,而是会发出警告,说明你的 @ToString 注解不执行任何操作。你可以使用 @lombok.experimental.Tolerate 标记任何方法以将其隐藏在 lombok 中。

数组通过 Arrays.deepToString 打印,这意味着包含自身的数组将导致 StackOverflowErrors。但是,这种行为类似于 ArrayList

如果某个方法被标记为包含并且它与字段具有相同的名称,则它将替换该字段的 toString 输出(包含该方法,排除该字段,并在原来字段将被打印的位置打印方法的输出)。

在lombok 1.16.22之前,可以使用 @ToString 注解的 ofexclude 参数完成包含/排除。现在仍然支持这种旧式包含机制,但将来会被弃用。

在成员上同时使用 @ToString.Exclude@ToString.Include 会生成警告;在这种情况下,成员将被排除在外。

我们不保证在 lombok 版本之间保持生成的 toString() 方法的输出相同。你永远不应该依赖ToString() 设计你的API,导致其他代码强制解析你的 toString() 输出!

默认情况下,任何以 $ 符号开头的变量都会自动排除。你只能使用 @ToString.Include 注解包含它们。

如果存在要包含的字段的getter,则调用它而不是直接使用字段引用。此行为可以被抑制: @ToString(doNotUseGetters = true)

@ToString 也可用于枚举定义。

附加部分

我增加了一些示例,详见代码