ToStringBuilerを使って簡単にBeanの中身を表示

偶数月はWEB+DBの月ということで、WEB+DB PRESS Vol.52を買ってきました。

WEB+DB PRESS Vol.52

WEB+DB PRESS Vol.52

id:Yoshioriとid:t_yanoの共著で書かれた、[新人さんに贈る]Javaプログラミングの習慣の中でcommons langのHashCodeBuilderとEqualsBuilderが紹介されていたので、便乗してToStringBuilderも便利ですよと紹介してみる。

準備

maven2で使うならcommons-langを追加するだけです。

<dependency>
	<groupId>commons-lang</groupId>
	<artifactId>commons-lang</artifactId>
	<version>2.4</version>
</dependency>

基本的な使い方

一番簡単な使い方はToStringBuilder#reflectionToString(Object object)を使う使い方です。以下のような感じ。

class Hoge {
	public Integer id = 1;
	public String value = "hoge";
	public String[] strValues = new String[] { "aaa", "bbb", "ccc" };
	public List<String> items = Arrays.asList("ddd", "eee", "fff");

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
}

とりえず出力してみる。

System.out.println(new Hoge());

出力結果はこんな感じ。

org.yamkazu.ToStringTest$Hoge@cafb56[id=1,value=hoge,strValues={aaa,bbb,ccc},items=[ddd, eee, fff]]

ちなみにprivateのフィールドもリフレクションで取得して表示してくれます。

出力形式を選択する

ToStringBuilder.reflectionToString(Object object, ToStringStyle style)を使うと第2引数に出力形式を選択できます。

DEFAULT_STYLE

上で示したデフォルトの出力スタイル。

@Override
public String toString() {
	return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
}

出力結果

org.yamkazu.ToStringTest$Hoge@cafb56[id=1,value=hoge,strValues={aaa,bbb,ccc},items=[ddd, eee, fff]]
MULTI_LINE_STYLE
@Override
public String toString() {
	return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}

出力結果

org.yamkazu.ToStringTest$Hoge@cf66b[
  id=1
  value=hoge
  strValues={aaa,bbb,ccc}
  items=[ddd, eee, fff]
]
NO_FIELD_NAMES_STYLE
@Override
public String toString() {
	return ToStringBuilder.reflectionToString(this, ToStringStyle.NO_FIELD_NAMES_STYLE);
}

出力結果

org.yamkazu.ToStringTest$Hoge@6f9b8e[1,hoge,{aaa,bbb,ccc},[ddd, eee, fff]]
SHORT_PREFIX_STYLE
@Override
public String toString() {
	return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}

出力結果

ToStringTest.Hoge[id=1,value=hoge,strValues={aaa,bbb,ccc},items=[ddd, eee, fff]]
SIMPLE_STYLE
@Override
public String toString() {
	return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
}

出力結果

1,hoge,{aaa,bbb,ccc},[ddd, eee, fff]
独自で拡張した場合は

いろいろあるけどDEFAULT_STYLEかなと個人的には思いますが、ToStringStyleクラスを継承すれば自前の出力形式を定義する事も簡単に出来ます。基本的にはコンストラクタの中でsetXXXを呼び出すと簡単に定義できます。この辺りは既存の定義クラスを参考にしてください。

特定のフィールドのみを出力対象にする

appendして行く方法
@Override
public String toString() {
	return new ToStringBuilder(this)
			.append(id)
			.append(value)
			.toString();
}

フィールド名を出力したい場合はフィールド名も指定します。

@Override
public String toString() {
	return new ToStringBuilder(this)
			.append("id", id)
			.append("value",value)
			.toString();
}

出力結果

org.yamkazu.ToStringTest$Hoge@aadc97[id=1,value=hoge]
ReflectionToStringBuilderを使う方法

toStringExcludeメソッドを使うと出力したくないフィールドを設定できます。

@Override
public String toString() {
	return ReflectionToStringBuilder.toStringExclude(this, new String[] { "strValues", "items" });
}

出力結果はさっきと一緒。

org.yamkazu.ToStringTest$Hoge@aadc97[id=1,value=hoge]

スタイルを指定したいときは以下のようにすれば出来ます。

@Override
public String toString() {
	return new ReflectionToStringBuilder(this,ToStringStyle.SIMPLE_STYLE)
		.setExcludeFieldNames(new String[] { "strValues", "items" })
		.toString();
}

出力結果

1,hoge

いやー便利ですね。