30

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);
}
4

9 に答える 9

44

Eclipse 3.5.2(および場合によっては以前のバージョン)は、すでにこの機能を提供しています。エディター内を右クリックすると、[ソース]-> [toString()の生成...]の下に表示されます。

自動生成するのが悪い習慣であるかどうかについてのあなたの質問に答えるためにtoString()、私の意見はそうではないということです。生成されたコードが自分で書いたコードと非常に似ている場合、なぜわざわざ入力するのでしょうか。

于 2010-04-16T13:41:08.580 に答える
36

個人的には、デバッグに役立つので、すべてのオブジェクトにtoStringメソッドを実装するのが好きです。

ApacheCommonsToStringBuilderの使用を検討します。

次のように、リフレクションを使用して単純なtoStringメソッドを実装できます。

public String toString() {
   return ToStringBuilder.reflectionToString(this);
}

このメソッドを使用すると、フィールドが追加された場合にtoStringメソッドを更新する必要がなくなります。

于 2010-04-16T13:37:27.247 に答える
12

lombokを使用する場合、toStringを生成する@ToStringアノテーションがあります。

たとえば、EclipseでtoStringを生成する代わりにこれを使用する方がはるかに優れている理由は、後でクラスの属性を追加、削除、または変更する場合は、toStringも再生成する必要があるためです。ロンボクを使用する場合は、それを行う必要はありません。

于 2010-04-20T11:38:22.533 に答える
5

スティーブとドンの答えに追加するには(それらの場合は+1):

toString()メソッドを単純にし、期待値をトリガーしないようにします(特に、nullになる可能性のあるフィールドに注意してください)。

可能であれば、クラスの他のメソッドを呼び出さないでください。少なくとも、toString()メソッドがオブジェクトを変更しないようにしてください。

そして、ばかげた例外-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);
           }

       }

}
于 2010-04-16T13:59:49.143 に答える
2

IntelliJ Ideaでは、Alt + Insertを押すと、[生成]ポップアップが開きます。次に、フィールドを選択して[OK]ボタンをクリックします。それでおしまい。

Alt+Insertを押してポップアップを生成する

[フィールド]を選択し、デフォルトのテンプレートをそのまま保持します

生成された文字列関数

その他のヒント:[toStringの生成]ダイアログでは、テンプレートコンボボックスのドロップダウンをクリックしてテンプレートを選択できます。ここでは、必要に応じてStringBufferを選択するか、必要に応じて他のテンプレートを選択できます。慣れるためにそれで遊んでください。それはいいですね :)

于 2018-04-04T17:17:14.907 に答える
1

toString()メソッドを生成するためのショートカット


  1. Alt + Shift + S + S(ダブル)を押します
  2. 右クリック->ソース->toString()の生成..。
  3. [ソース]メニュー->[toString()の生成... ]に移動します。
  4. Windowsメニュー->設定->一般->キーに移動します(テキストフィールドにGenerate toStringを書き込みます)
于 2015-10-08T12:23:51.813 に答える
0

生成されたテキストのオーディエンスに関してtoString()を追加するときは、明確にしてください。一部のフレームワークはtoString()メソッドを使用してエンドユーザーに表示されるテキストを生成しますが(特定のWebフレームワークなど)、多くの人はtoString()メソッドを使用してデバッグ/開発者情報を生成します。いずれにせよ、要件を満たすのに十分な一意性がtoString実装にあることを確認してください。

toString()のデフォルトのJDK実装は開発者情報を生成するので、それは通常、可能であれば私が推奨するパターンですが、異なるアイデア/期待を持つプロジェクトで作業している場合は、混乱する可能性があります...

于 2010-04-17T23:47:22.313 に答える
0

気づいたことですが、NetBeans IDEでは、生成するフィールドを選択するright click->insert codeか、ショートカットALT+INSERTを使用してtoString()を選択し、toString()メソッドを生成できます。

見た目は:

@Override
public String toString() {
    return "ClassName{"+"fieldName="+fieldName+'}';
}

デバッグするのに最適な方法であり、追加のライブラリは必要ありません。

于 2017-02-24T20:11:45.313 に答える
0

@Steveを含むいくつかの古い回答を考慮して、最新のライブラリに従って回答を追加したいと思います。

依存関係を追加する

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.10</version>
        </dependency>

あなたのクラスで

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;

public class User {
     ... 

     @Override
     public String toString() {
          return ReflectionToStringBuilder.toString(this);
     }
}

以下のように特定のフィールドを除外できます

    ... 
    @Override
    public String toString() {
        return ReflectionToStringBuilder.toStringExclude(this, "name"); // Name will be excluded from toString output 
    }
于 2020-05-20T14:37:41.997 に答える