- 2008年7月18日 23:35
- プログラミング
-
Javaで以下のようなクラスを作成したとします。
public class Human {
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
プログラム中でHumanクラスのオブジェクトの内容を標準出力やログファイルに出力したい場合、Humanクラスに以下のようなtoString()メソッドを追加すると思います。
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("[");
sb.append("name=");
sb.append(this.getName());
sb.append(",");
sb.append("age=");
sb.append(this.getAge());
sb.append(",");
sb.append("sex=");
sb.append(this.getSex());
sb.append("]");
return sb.toString();
}
これにより、「[name=Kadoppe,age=24,sex=male]」のように、オブジェクトが保持するデータの内容を出力することができます。
しかし、今回は属性が3つでしたが、属性の数がものすごく多くなった場合、toString()メソッドを実装するのはとても面倒になりそうです。。
また、クラスを定義するごとにtoStringメソッドを書いていたのでは、あまりオブジェクト指向らしくないですよね。
そこで登場するのが「ReflectionToStringBuilder」というクラスです。
Commons Langというライブラリに含まれているクラスです。
Commons Langのjarファイルはこちらからダウンロードできます。
ダウンロードしたファイルを展開したディレクトリの中にあるcommons-lang-2.4.jarというファイル(バージョン名は読み替えてください)にクラスパスを通せば使用準備完了です。
どうやって使うのかと言いますと、Humanクラスをを以下のように書き換えます。
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
public class Human {
============= 中略 ==============
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
なんと、あの長かったtoStringメソッドの中身がたった一行に!
これは素晴らしいですね!
この状態のHumanクラスのオブジェクトのtoString()メソッドを呼び出すと、以下のように出力されます。
すごい!
Human@84abc9[name=Kadoppe,age=24,sex=male]
とっても便利なReflectionToStringBuilderクラス。
何ともオブジェクト指向っぽくtoStringメソッドを実装することができます。
欠点は、リフレクションを使っているので、通常よりも処理時間がかかってしまうということ。
最初はReflectionToStringBuilderクラスを使ってtoStringメソッドを実装し、時間が気になる箇所は今まで通りの方法で個別にtoStringメソッドを実装するのが、いいかと思います!
ぜひお試しあれー。