10

私はJavadocが言うことを知っています:

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

しかしtoString、クラスのメソッドのオーバーライドに時間を費やす必要があるのはいつですか?それは私がオーバーライドすることと一緒に最初に行うことの1つである必要がequalsありhashCodeますか?それとも、実際に必要になるまで待つ必要がありますか?

EclipseがtoStringメソッドを自動生成できることは知っているので、クラスのフィールドがわかったら、Eclipseにメソッドを自動生成させる必要がありますか?

4

5 に答える 5

15

Josh Blochは、 EffectiveJavaの項目10で適切な説明をしています。

[...]優れたtoString実装を提供することで、クラスをより快適に使用できるようになります。

toString()直接提供されるオブジェクトの文字列表現を使用できるため、デバッグトレースの出力が非常に簡単になり、ログメッセージが改善されます。オブジェクトに必要な情報を提供する文字列を手動で作成する必要はありません。

本に記載されているように、結果のにすべての興味深い情報を含める必要がありますString。また、メソッドを適切に文書化する必要があります。結果のStringフォーマットを文書化することもできませんが、少なくとも意図を文書化する必要があります(フォーマットが変更される可能性があるかどうか)。

結局、すべてのクラスでそれをオーバーライドすることがあなたの習慣の一部であるかどうかを決定するのはあなた(そしてあなたの会社の基準)次第です。個人的にはtoString ()、すべてのクラスでオーバーライドするのではなく、デバッグトレースで使用されるリスクが最も高いクラスでのみオーバーライドします。

于 2012-12-13T19:55:37.780 に答える
3

toString()を保持するすべてのクラスにメソッドを実装しますhuman understandable non confidential data。例:転送オブジェクト、Bean、データオブジェクト、ラッパー。このようなクラスの場合は、「toString()」メソッドの実装に進みます。

一時的な状態のサービス、プロセスを表すクラスは、メソッドを実装する必要はありません。ここでは、実際に必要になるまで待つことができます。

'toString()'で「transient」キーワードを使用して変数を公開しないようにしてください。

于 2012-12-13T20:21:11.593 に答える
1

通常、オブジェクトを表示するデフォルトの形式を割り当てたい場合は、これをオーバーライドします。多くの場合、関連する属性のコンパクトで消化可能な表示をフォーマットします。たとえば、次のようにして、デバッグまたはログに表示することができます。

MyClass myClsInst = new MyClass();
...
System.out.println(myClsInst);
于 2012-12-13T20:50:28.753 に答える
1

一般に、オブジェクトが何を持っているかを表示または確認するために使用されます。

たとえば、Studentクラスがあり、オブジェクトを作成したとします。

学生クラスには、年齢、学年、GPA、名前、国、住所があります。

class Student{
    private int age;
    private int grade;
    private double gpa;
    private String name;
    private String country;
    private String address;

    Student(...){
       // ...
    }

    public String toString(){
        String str = "age is "+age+ ", grade is " + grade + ...
        return str;
    }
}

そして、あなたはAの学生とBの学生(そして多分それ以上)を作成しました

次のように内部をチェックするには、「toString()」を実行する必要があります。

System.out.println(aStudent.toString());
System.out.println(bStudent.toString());

または、オブジェクト名を書き込むだけで、自動的に「toString()」が呼び出されます。

System.out.println(aStudent);
System.out.println(bStudent);

それは冗長な作業を取り除き、より速くします。

次に、次のように表示されます。

Output:
age is 13, grade is 3, ...
age is 15, grade is 5, ...

デバッグするときに、Aの学生またはBの学生が何を持っているかを確認するときに役立ちます。

また、JSONのような独自のフォームを作成する場合にも便利です。

JSON形式でデータを操作する方が簡単です。

于 2018-10-20T14:52:40.860 に答える
0

私は簡単な方法でデモンストレーションしようとしています。

package com.web.doamin;

public class User {

    String name;

    long id;

    /*@Override
    public String toString() {
        return "User [user = " + name + ", id="+ id + "]"; 
    }*/
    public static void main(String[] args) {
        User user = new User();
        System.out.println(" : user : " + user );
    }
}

toString()メソッドをオーバーライドしなかった場合、sysoutでオブジェクトハッシュコードを取得します

toString()メソッドをオーバーライドしないO/P -com.web.doamin。User @ 7852e922

ToString()メソッドをオーバーライドすると、O / P- User [user = null、id=0]が得られます。

-System.out.println ()でオブジェクトが使用されると適切な出力が得られるため、toString()をオーバーライドすることをお勧めします。

于 2018-10-20T14:41:52.517 に答える