toString()メソッドは、JavaのObjectクラスの標準メソッドで、オブジェクトの文字列表現を取得するために使用されます。歴史的には、デバッグやロギングを支援するために導入され、オブジェクトの技術的情報(ClassName@hashCode)の出力の代わりに、意味のある、読みやすい説明を得ることができます。
初期の段階では、toString()をオーバーライドしない場合、メソッドはクラス名@ハッシュコード形式の文字列を返します。これはオブジェクトの状態を理解したり出力したりするのに不便です。したがって、toString()をオーバーライドすることは良いプラクティスとなっています。
明示的なtoString()の実装がないと、オブジェクトのデバッグやロギングが困難になります。オブジェクトに何が含まれているのか、内部構造やフィールドの現在の値を知らなければ理解できません。
toString()を正しくオーバーライドすることで、次のことが可能になります:
コードの例:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } }
主な特徴は次のとおりです:
全てのクラスでtoString()メソッドをオーバーライドする必要がありますか?
いいえ、必ずしも必要ではありませんが、オブジェクトが頻繁にログに出力されたりデバッグに使用されたりするクラスでは、オーバーライドすることが非常に望ましいです。
toString()メソッドは例外をスローすることができますか?
技術的には可能です。例えば、フィールドへのアクセス時にNullPointerExceptionが発生する場合などですが、良いプラクティスとしては、toString()が常に正しい文字列を返すようにすることです。
toString()の呼び出しは明示的に行う必要がありますか?
いいえ、コンパイラーはオブジェクトと文字列を連結する際やSystem.out.printlnを通じてオブジェクトを出力する際に暗黙的に呼び出します。
Person p = new Person("Ivan", 25); System.out.println(p); // p.toString()が自動的に呼び出されます
プログラマーはUserクラスでtoString()をオーバーライドせず、ログに書き込みます:
log.info(user);
メリット:
デメリット:
User@1a2b3c形式の文字列が得られ、ユーザーに関する情報がない。プログラマーはtoString()をオーバーライドします:
@Override public String toString() { return "User{name='" + name + "', id=" + id + "}"; }
メリット:
デメリット: