commons-langでtoStringメソッドを簡単に実装する

山崎良
2008-08-08 18:13:01
  • このエントリーをはてなブックマークに追加

 第9回はtoStringメソッドを簡単に実装するためのクラス、ToStringBuilderを扱う。

ToStringBuilder

 ToStringBuilderは、toStringメソッドの実装を簡単にするメソッドである。まずは解説のために書いたコードと、その実行結果を見てみよう。

public class ToStringBuilderTest {

private String testStr;
private boolean testBoolean;
private int testInt;
private String[] testArray;


public String toString() {
return new ToStringBuilder(this)
.append("testStr",testStr)
.append("testBoolean",testBoolean)
.append("testInt",testInt)
.append("testArray",testArray)
.toString();
}

public static void main(String[] args) {

// インスタンスを生成してtoStringメソッドの結果を出力する
ToStringBuilderTest test = new ToStringBuilderTest();
System.out.println(test);//……(1)

// フィールド値をセットして再度出力する
test.setTestStr("ABC");
test.setTestBoolean(true);
test.setTestInt(1);
test.setTestArray(new String[]{"aaa","bbb"});

System.out.println(test);//……(2)


}

// 以下アクセサ(getter/setter)は省略

 ポイントは以下の4点である。

  • このクラスは「String」「boolean」「int」「String[]」型の4つのフィールドを持つ
  • toStringメソッドはこの4つのフィールドの値を全て含む文字列を生成して返す
  • toStringメソッドの実装に「ToStringBuilder」クラスを使用している
  • toStringメソッドの実行結果を確認するためにmainメソッドを記述した

 mainメソッドを実行した結果は以下のようになる。

ToStringBuilderTest@166aa18[strTest=,blnTest=false,intTest=0,strArrayTest=]
ToStringBuilderTest@166aa18[strTest=ABC,blnTest=true,intTest=1,strArrayTest={aaa,bbb}]

 1行目はToStringBuilderTestクラスのインスタンスを生成してそのまま出力した結果(1)で、2行目は各フィールドに値をセットしてから出力した結果(2)である。

 もう一度、toStringメソッドの内容を見てみよう。

public String toString() {
return new ToStringBuilder(this)
.append("testStr",testStr)
.append("testBoolean",testBoolean)
.append("testInt",testInt)
.append("testArray",testArray)
.toString();
}

 ToStringBuilderを使用して文字列を生成するのは、StringBufferクラスやStringBuilderクラスを使用して文字列を生成する場合と比べ、

  • 簡単にフィールド名を指定できる。
  • nullの処理
  • 配列の処理

 などの点で手間が軽減される。

 同じ実行結果を得るために、ToStringBuilderを使用せずにtoStringメソッドを記述してみたところ、以下のようになった(厳密には全く同じ動作ではないかもしれない。コード量の参考程度に見ていただきたい)。

 ToStringBuilderクラスを使った場合と比べて、かなりの手間がかかることがわかるだろう。

public String toString() {
StringBuilder sb = new StringBuilder()
.append(this.getClass().getName())
.append("@")
.append(Integer.toHexString(System.identityHashCode(this)))
.append("[");

sb.append("testStr=");
if(testStr!=null){
sb.append(testStr);
}else{
sb.append("");
}
sb.append(",testBoolean=").append(testBoolean);
sb.append(",testInt=").append(testInt);

sb.append(",testArray=");
if(testArray!=null){
sb.append("{");
for(int i=0;i");
}

sb.append("]");
return sb.toString();
}

 ToStringBuilderクラスを使うことで、toStringメソッドの実装の手間が大幅に削減され、コードも見やすいものになる。積極的に使っていきたいクラスの1つだ。

  • 新着記事
  • 特集
  • ブログ