Java基礎ーtoString()メソッドの実装

toString()の実装

今日はtoString()メソッドの実装についてまとめます。 業務ではapacheのToStringBuilderやLombokに頼っている印象です。

何も実装しなかった時の挙動

以下のようなShainクラスがあったとする。

public class Shain {

    private String name;

    private int shainId;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getShainId() {
        return shainId;
    }

    public void setShainId(int shainId) {
        this.shainId = shainId;
    }
}

public class Main {

    public static void main(String[] args) {
        Shain shain = new Shain();
        shain.setName("山田");
        shain.setShainId(12345);

        System.out.println(shain.toString());
    }
}

デフォルトで定義されているtoStringメソッドを実行すると以下のような結果が取得される。
クラス名とハッシュ値しか分からず、フィールドにどのような値が設定されているのかがこれでは分からない。

jp.co.sample.study.bean.Shain@4926097b

自分で実装

Shainクラスで自分でShainの中身をとれるようにtoString()をオーバーライドする。

@Override
public String toString() {
    return "Shain [name=" + name + ", shainId=" + shainId + "]";
}

結果は以下のようになる

Shain [name=山田, shainId=12345]

ToStringBuilder

apache commons-lang3の便利メソッド。
依存関係にcommons-lang3を追加する必要があるが、スタイルを選択するだけで出力の形式を自由に変えられるのは便利。

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}
jp.co.sample.study.bean.Shain@7cdbc5d3[name=山田,shainId=12345]

出力のスタイルを定義することもできる

@Override
public String toString(){
    // 第2引数でスタイルを指定
    return ToStringBuilder.reflectionToString(this,ToStringStyle.SIMPLE_STYLE);
}

指定可能なスタイル

スタイル 出力例
SIMPLE_STYLE John Doe,33,false
SHORT_PREFIX_STYLE Person[name=John Doe,age=33,smoker=false]
NO_FIELD_NAMES_STYLE Person@182f0db[John Doe,33,false]
MULTI_LINE_STYLE Person@182f0db[
name=John Doe
age=33
smoker=false
]
DEFAULT_STYLE Person@182f0db[name=John Doe,age=33,smoker=false]
NO_CLASS_NAME_STYLE [name=John Doe,age=33,smoker=false]
JSON_STYLE {"name": "John Doe", "age": 33, "smoker": true}

lombok

クラスにアノテーションを付与することで、getterやsetter、toStringやequalsメソッド、コンストラクタを自動生成するツール。 こちらもLombokの依存関係を追加する必要がある。

@ToString
public class Shain {

    private String name;

    private int shainId;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getShainId() {
        return shainId;
    }

    public void setShainId(int shainId) {
        this.shainId = shainId;
    }
}