JavaのtoStringメソッドは常にオーバーライドする

まだ業務が始まらないので、窓際の席で細々とJavaの基礎を復習している。Effective Javaを読み始めたので、この本の中で知らなかったことを順次メモしていこうと思う。
 

toStringメソッドとは

toStringメソッドは、インスタンスの文字列表現を返すメソッドである。その文字列は「クラス名@ハッシュコード」のような形式であり、具体的には「PhoneNumber@163b91」となる(正確にはgetClass().getName() + '@' + Integer.toHexString(hashCode())と等しい値を返す)。toStringメソッドは、java.lang.Objectに実装されているメソッドであり、Javaの実装では全てのクラスがjava.lang.Objectを継承しているため、全てのクラスでtoStringメソッドを呼び出すことが出来る。
 
toStringメソッドのドキュメントには次のように書かれている。

toStringメソッドはこのオブジェクトを「テキストで表現する」文字列を返します。この結果は、人間が読める簡潔で有益な情報であるべきです。すべてのサブクラスで、このメソッドをオーバーライドすることをお勧めします。

 
上記の通り、オブジェクトをテキストで表現する、人間が読める簡潔で有益な情報を返す役割を持っており、全てのクラスでtoStringメソッドをオーバーライドすることが推奨されている。
 

toStringメソッドをオーバーライドする

toStringメソッドが返す結果が「PhoneNumber@163b91」のような形式では、オブジェクトをテキストで表現する、人間が読める簡潔で有益な情報を返す役割を果たしていないので、これをオーバーライドして内容を書き換える必要がある。
ここでの「オブジェクトをテキストで表現する、人間が読める簡潔で有益な情報」とは、toStringメソッドをオーバーライドして実装する人が有益だと思う情報で構わない。J2SEの多くのクラスは、ObjectクラスのtoStringメソッドをオーバーライドし、内部情報を出力する。自分で作成したクラスに「toStringメソッドで内部情報を出力する」機能を持たせる場合、ObjectクラスのtoStringメソッドをオーバーライドし、フィールド等の「インスタンスの情報」を文字列化し、戻り値として返せばよい。
 
以下にtoStringメソッドをオーバーライドする例を示す。

/*
 * @see java.lang.Object#toString()
 */

@Override
public String toString() {
    return "Dog [name=" + name + ", color=" + color + "]";
}

 

toStringメソッドの使い方

オーバーライドしたtoStringメソッドは、printfやprintlnメソッドの内部で呼ばれているので、主に次のような使い方が出来る。

Dog myDog = new Dog();
myDog.setName("チャッピー");
myDog.setDescription("2014年6月生まれのチワワとミニチュアダックスのハーフ犬。");
System.out.println(myDog);

 
上記の例では、以下の内容が出力される。

Dog [name=チャッピー, Description=2014年6月生まれのチワワとミニチュアダックスのハーフ犬。]

 
このようにtoStringメソッドをオーバーライドするとデバッグの情報出力が格段に楽になる。しかし、toStringメソッドで出力する変数には、必ずゲッターを設けるべきである。理由は、toStringメソッドは主にデバッグの用途で使うべきものであり、将来的にtoStringメソッドから受け取った内容をパースして使い回すような悪い設計のコードが生産されることを防ぐためである。
 
 
以上
 
 
参考
書籍 Effective Java
Object (Java Platform SE 6) #toString()
toStringとは : JavaA2Z
10年間Javaを書いていた僕が Effective Java 第2版を読み返して新人に薦められるのかを考えてみた | susumuis Info

Article written by

Comments are closed, but trackbacks and pingbacks are open.