【lombok】@ToString-自分でtoStringを書く必要はありません.lombokに生成してもらいます.


@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が表示された後、フィールド名widthheightは付きません.
最後にToStringExampleのtoStringメソッドを見て、STATIC_VARは静的フィールドなので、toStringメソッド内には配置されません.また、idに@ToString.Exclude注記が追加されているため、このフィールドはtoStringメソッド内にも配置されません.
この章は終わります!