欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

@ToString,

来源: javaer 分享于  点击 3153 次 点评:219

@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)
如果设置为calltoString则如果您的类扩展了某些内容,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之前,可以使用注释的ofexclude参数完成包含/排除@ToString。这种旧式包含机制仍然受支持,但将来会被弃用。

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

我们不保证toString()在lombok版本之间保持生成的方法的输出相同。你永远不应该设计你的API,以便其他代码被迫解析你的toString()输出!

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

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

@ToString也可以用于枚举定义。

转载于:https://www.jianshu.com/p/778cc2711bd0

相关文章

    暂无相关文章

用户点评