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; } }