【lombok】@ToString-自分でtoStringを書く必要はありません.lombokに生成してもらいます.
18870 ワード
@ToString
どのクラス定義も
デフォルトでは、すべての非静的フィールドが印刷されます.一部のフィールドをスキップする場合は、
メソッド呼び出しの出力はtoStringに含めることができます.パラメータなしのインスタンス(非静的)メソッドのみを含めることができます.このためには、@ToString.Includeタグを使用してメソッドをマークします.
コードインスタンス
mainメソッドを実行すると、次のように印刷されます.
Shape[1929600551] ToStringExample.Square(super=Shape[1053782781], 1, 2) ToStringExample(name=null, shape=ToStringExample.Square(super=Shape[1211888640], 5, 10), tags=[1, 2, 3])
なぜこのように印刷されたのかを理解してから、下のコンパイル後に生成されたclassファイルを見て印象を深めます.
コンパイルされたclassファイルは次のとおりです.
Shapeクラスを見て、System.out.printXXメソッドを呼び出すと、デフォルトではオブジェクトのtoStringメソッドが呼び出されますので、ShapeのtoString印刷結果は分かりやすいです.
SquareのtoStringメソッドを見ると、SquareクラスはToStringExampleクラスの静的内部クラスであるため、そのクラス名の前にToStringExampleクラス名が表示されます.
最後にToStringExampleのtoStringメソッドを見て、STATIC_VARは静的フィールドなので、toStringメソッド内には配置されません.また、idに@ToString.Exclude注記が追加されているため、このフィールドはtoStringメソッド内にも配置されません.
この章は終わります!
どのクラス定義も
@ToString
注釈でlombokにtoString()メソッドの実装を生成させることができる.デフォルトでは、クラス名と各フィールドが順番に印刷され、カンマで区切られます.includeFieldNameパラメータを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で、上位レベルのメンバーが最初に印刷され、同じレベルのメンバーがソースファイルに表示される順序で印刷されます.コードインスタンス
package com.amos;
import lombok.ToString;
/**
* @author amos
*/
@ToString
public class ToStringExample {
/**
* field toString
*/
private static final int STATIC_VAR = 10;
private String name;
private Shape shape = new Square(5, 10);
private String[] tags = new String[]{"1", "2", "3"};
/**
* @ToString.Exclude
* toString
*/
@ToString.Exclude
private int id;
/**
* callSuper -> toString toString
* includeFieldNames -> ,false true true
*/
@ToString(callSuper = true, includeFieldNames = false)
public static class Square extends Shape {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
}
public static class Shape {
@Override
public String toString() {
return "Shape[" + this.hashCode() + "]";
}
}
public static void main(String[] args) {
System.out.println(new Shape());
System.out.println(new Square(1,2));
System.out.println(new ToStringExample());
}
}
mainメソッドを実行すると、次のように印刷されます.
Shape[1929600551] ToStringExample.Square(super=Shape[1053782781], 1, 2) ToStringExample(name=null, shape=ToStringExample.Square(super=Shape[1211888640], 5, 10), tags=[1, 2, 3])
なぜこのように印刷されたのかを理解してから、下のコンパイル後に生成されたclassファイルを見て印象を深めます.
コンパイルされたclassファイルは次のとおりです.
package com.amos;
import java.util.Arrays;
public class ToStringExample {
private static final int STATIC_VAR = 10;
private String name;
private ToStringExample.Shape shape = new ToStringExample.Square(5, 10);
private String[] tags = new String[]{"1", "2", "3"};
private int id;
public ToStringExample() {
}
public static void main(String[] args) {
System.out.println(new ToStringExample.Shape());
System.out.println(new ToStringExample.Square(1, 2));
System.out.println(new ToStringExample());
}
public String toString() {
return "ToStringExample(name=" + this.name + ", shape=" + this.shape + ", tags=" + Arrays.deepToString(this.tags) + ")";
}
public static class Shape {
public Shape() {
}
public String toString() {
return "Shape[" + this.hashCode() + "]";
}
}
public static class Square extends ToStringExample.Shape {
private final int width;
private final int height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
public String toString() {
return "ToStringExample.Square(super=" + super.toString() + ", " + this.width + ", " + this.height + ")";
}
}
}
Shapeクラスを見て、System.out.printXXメソッドを呼び出すと、デフォルトではオブジェクトのtoStringメソッドが呼び出されますので、ShapeのtoString印刷結果は分かりやすいです.
SquareのtoStringメソッドを見ると、SquareクラスはToStringExampleクラスの静的内部クラスであるため、そのクラス名の前にToStringExampleクラス名が表示されます.
callSuper = true
が追加されているので、toStringメソッドには、スーパークラスのtoStringメソッドが追加されます(classファイルを参照).includeFieldNames = false
を見ると、toStringのデフォルトではフィールド名が付き、falseが表示された後、フィールド名width
とheight
は付きません.最後にToStringExampleのtoStringメソッドを見て、STATIC_VARは静的フィールドなので、toStringメソッド内には配置されません.また、idに@ToString.Exclude注記が追加されているため、このフィールドはtoStringメソッド内にも配置されません.
この章は終わります!