いくつかの単純なクラスに対してtoString
メソッドを自動生成することは良いことですか、悪いことですか?
変数名を受け取り、名前とそれに続く値を出力するtoString
メソッドを生成する、以下のようなものを生成することを考えていました。
private String name;
private int age;
private double height;
public String toString(){
return String.format("Name: %s Age: %d Height %f", name, age, height);
}
Eclipse 3.5.2(およびおそらく以前のバージョン)はすでにこの機能を提供しています。エディター内で右クリックすると、ソース-> Generate toString()...にあります。
toString()
を自動生成することは悪い習慣であるかどうかについてのあなたの質問に答えるために、私の意見はそうではないということです。生成されたコードが自分で作成したコードと非常に似ている場合、なぜそれを入力する必要があるのでしょうか。
私は個人的には、デバッグに役立つように、すべてのオブジェクトに対してtoStringメソッドを実装するのが好きです。
Apache Commons ToStringBuilder の使用を検討します。
次のようにリフレクションを使用して、単純なtoStringメソッドを実装できます。
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
このメソッドを使用すると、フィールドが追加された場合にtoStringメソッドを更新する必要がなくなります。
lombok を使用する場合、to-Stringを生成する @ ToString アノテーションがあります。
たとえばEclipseでtoStringを生成する代わりにこれを使用する方がはるかに良い理由は、後でクラスの属性を追加、削除、または変更した場合、toStringも再生成する必要があるためです。 lombok を使用する場合、その必要はありません。
スティーブとドンの回答に追加するには(+1)
toString()
メソッドをシンプルにし、それが決してトリガーの期待をトリガーしないことを確認します(特にnullの可能性があるフィールドに注意してください)。
可能であれば、クラスの他のメソッドを呼び出さないでください。少なくとも、toString()
メソッドがオブジェクトを変更しないようにしてください。
そして、愚かな例外から文字列へのループに注意してください:
public class MyClass {
...
public String toString() {
// BAD PRACTICE 1: this can throw NPE - just use field1
return " field1=" + field1.toString()
+ " extraData=" + getExtraData();
// BAD PRACTICE 2: potential exception-toString loop
}
public MyExtraData getExtraData() {
try {
.... do something
} catch(Exception e) {
throw new RuntimeException("error getting extradata - " + this.toString(),e);
}
}
}
ちょうど気づいた-NetBeans IDEの場合right click->insert code
に対して生成するフィールドを選択するか、ショートカットALT+INSERT
を使用してtoString()メソッドを生成し、次にtoString()を選択します。
見た目は:
@Override
public String toString() {
return "ClassName{"+"fieldName="+fieldName+'}';
}
デバッグするための素晴らしい方法であり、追加のライブラリは必要ありません。
生成されたテキストの対象者に関してtoString()を追加するときは明確にしてください。一部のフレームワークはtoString()メソッドを使用してエンドユーザーに表示されるテキスト(特定のWebフレームワークなど)を生成しますが、多くの人はtoString()メソッドを使用してデバッグ/開発者情報を生成します。どちらの方法でも、toString実装に十分な一意性があり、要件を満たしていることを確認してください。
ToString()のデフォルトのJDK実装は開発者情報を生成するため、通常は可能であれば私が推奨するパターンですが、別のアイデア/期待でプロジェクトに取り組んでいる場合、混乱する可能性があります...