Java 我应该何时重写toString()?

Java 我应该何时重写toString()?,java,Java,我知道: 返回对象的字符串表示形式。总的来说 toString方法返回一个字符串,该字符串“以文本形式表示”此 对象结果应该是简洁但信息丰富的表示 这对一个人来说很容易阅读。建议所有 子类重写此方法 但是,我应该在什么时候为我的类重写toString方法呢?这应该是我在重写equals和hashCode时首先做的事情之一吗?或者我应该等到真正需要的时候 我知道Eclipse可以为您自动生成toString方法,所以我应该在知道类的字段后让Eclipse自动生成它们吗?Josh Bloch在第10

我知道:

返回对象的字符串表示形式。总的来说 toString方法返回一个字符串,该字符串“以文本形式表示”此 对象结果应该是简洁但信息丰富的表示 这对一个人来说很容易阅读。建议所有 子类重写此方法

但是,我应该在什么时候为我的类重写
toString
方法呢?这应该是我在重写
equals
hashCode
时首先做的事情之一吗?或者我应该等到真正需要的时候


我知道Eclipse可以为您自动生成
toString
方法,所以我应该在知道类的字段后让Eclipse自动生成它们吗?

Josh Bloch在第10项中给出了很好的解释

[…]提供一个好的toString实现可以使您的类更易于使用

由于可以直接使用
toString()
提供的对象的字符串表示形式,因此它确实可以更容易地输出调试跟踪,或者生成更好的日志消息;您不必手动构建提供对象所需信息的字符串

如本书所述,您应该在生成的
字符串中包含所有有趣的信息。你也应该适当地记录你的方法;您可以记录生成的
字符串
格式,也可以不记录,但至少应该记录您的意图(无论格式是否可能更改)


最后,由你(和你公司的标准)来决定是否在每门课上都将其作为你习惯的一部分。就个人而言,我不会在每个类中重写
toString()
,只在那些最有可能被用于调试跟踪的类中重写

我将在任何包含人类可理解的非机密数据的类上实现
toString()
方法。例如:传输对象、bean、数据对象、包装器。对于此类类,只需继续实现“toString()”方法

表示具有瞬态的服务、进程的类不需要实现该方法


确保不要在“toString()”中公开任何带有“transient”关键字的变量

通常,当我想要指定显示对象的默认格式时,我会覆盖它,通常会格式化相关属性的紧凑/可消化显示。因此,我可以简单地(例如)通过执行以下操作在调试或日志中显示它:

MyClass myClsInst = new MyClass();
...
System.out.println(myClsInst);

我试着用简单的方式来演示

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中获得对象哈希代码

O/p不覆盖toString()方法-com.web.doamin.User@7852e922

如果我们重写ToString()方法,我们将得到O/p-User[User=null,id=0]


注意-重写toString()是一个好主意,因为当在System.out.println()中使用对象时,我们可以获得正确的输出

通常,它用于显示或查看对象的内容

例如,假设有一个学生类,您创建了对象

学生班级有年龄、年级、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;
    }
}
你创造了一个学生和一个B学生(也许更多)

您只需使用“toString()”检查其内部,如下所示:

System.out.println(aStudent.toString());
System.out.println(bStudent.toString());
Output:
age is 13, grade is 3, ...
age is 15, grade is 5, ...
或者您可以只写对象名,它会自动调用“toString()”

它可以更快地消除冗余工作

然后,您将看到如下所示:

System.out.println(aStudent.toString());
System.out.println(bStudent.toString());
Output:
age is 13, grade is 3, ...
age is 15, grade is 5, ...
当您在调试时看到一个学生或B学生拥有什么时,它非常有用

而且,当您创建自己的表单(如JSON)时,它也很有用


使用JSON格式操作其数据会更容易。

我很少这样做,如果我这样做是为了调试,因为现代IDE可以马上为您生成此方法,如果您希望打印对象,为什么不使用它呢?忽略自动生成的可能性,这取决于您。香草toString只打印出对象类和散列标识符。如果您想使用toString进行诊断打印,那么值得添加您自己的,以在rational presentation中打印出对象的重要字段。或者,根据经验,大约是您第三次使用println打印出对象的多个字段,现在是编写您自己的toString的时候了。看看哪种方法可以基于添加到类中的单个
@toString
注释动态生成您的
toString()
方法。这比Eclipse的代码生成更好,因为它在您更改类的字段后自动调整代码。+1大多数IDE都可以为您生成toString()。当我认为我可能会使用它时,我倾向于创建一个。