ヒトリ歩き

愚痴とかいろいろ書きます

toStringメソッドの実装がToStringBuilderクラスを使えば楽になる

はじめに

クラスのメンバ変数の値をログに出力する際に、toStringメソッドを実装して各メンバ変数の値を含めてString型の値を返すような実装をしていると思う。
メンバ変数が少ないと楽だが、メンバ変数が多い場合は実装するにも手間がかかる。
そのような場合、ToSTringBuilderクラスを使用するとtoStringメソッドの実装が楽になるのでどのように出力されるのか簡単に試してみる。

commons.apache.org

ToStringBuilderを試してみる

プリミティブ型のメンバ変数を持つクラス

プリミティブ型のメンバ変数を持つクラスを用意してToStringBuilderを実行してみる。

public class Student {

    int student_number = 0;

    String firstName = null;

    String lastName = null;

    int age = 0;

    public Student(int number, String firstName, String lastName, int age) {
        this.student_number = number;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

}

ToStringBuilderを実行するクラスは以下のように実装。

import org.apache.commons.lang3.builder.ToStringBuilder;

public class Main {

    public static void main(String args[]) {
        Student student1 = new Student(1, "tanaka", "test", 13);
        System.out.println(ToStringBuilder.reflectionToString(student1));
    }

}

実行すると以下のように出力された。

Student@7d417077[age=13,firstName=tanaka,lastName=test,student_number=1]

コレクションクラスをメンバ変数を持つ場合はどのように出力されるのか

プリミティブ型ではなく、コレクションクラスをメンバ変数に持つ場合はどのように出力されるのか確認してみる。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Student {

    int student_number = 0;

    String firstName = null;

    String lastName = null;

    int age = 0;

    List<Integer> historyClass = null;
    Map<String, String> committee = null;

    public Student(int number, String firstName, String lastName, int age) {
        this.student_number = number;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.historyClass = new ArrayList<>();
        this.historyClass.add(1);
        this.historyClass.add(6);
        this.committee = new HashMap<>();
        this.committee.put("1", "ikimono");
    }

}

出力結果は以下のとおり。 コレクションクラスが保持する値も出力されることがわかる。

Student@7d417077[age=13,committee={1=ikimono},firstName=tanaka,historyClass=[1, 6],lastName=test,student_number=1]

出力フォーマットの変更が可能

ToStringBuilderクラスを使ってメンバ変数を出力する際のフォーマットを指定することが可能。 やり方としては、reflectionToString メソッドにスタイルをパラメータとして渡すか、事前にsetDefaultStyle(ToStringStyle style)でスタイルを設定しておく2パターンになる。

出力フォーマットの種類

出力フォーマットはToStringStyleクラスを設定することで変更可能。

commons.apache.org

種類 説明
DEFAULT_STYLE デフォルトの出力スタイル。 値をカンマ区切りで出力
MULTI_LINE_STYLE 値を複数行で出力
NO_FIELD_NAMES_STYLE メンバ変数名まで一緒に出力せずに、値だけ出力(クラス名は出力する)
SHORT_PREFIX_STYLE オブジェクト情報まで一緒に出力せずに出力
SIMPLE_STYLE 値のみを出力。
NO_CLASS_NAME_STYLE クラス名は出力せずに、メンバ変数名と値を出力
JSON_STYLE JSON形式で出力

最後に

ToStringBuilderクラスを活用すれば、toStringメソッドの実装が簡単にできる。
ログにはクラス名まで不要であれば、出力スタイルを変更することで、ログの出力内容の見直しが出来て良いと思った。
今後、ToStringBuilderクラスを活用できたらと思う。