10

我知道Javadocs 说

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

toString但是我什么时候应该花时间为我的课程重写方法呢?它应该是我与覆盖equals和一起做的第一件事hashCode吗?还是我应该等到真正需要它?

我知道 Eclipse 可以toString为你自动生成方法,所以一旦我知道我的类的字段,我是否应该让 Eclipse 自动生成它们?

4

5 回答 5

15

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

[...] 提供一个好的 toString 实现会让你的类使用起来更加愉快。

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

如书中所述,您应该在结果中包含所有有趣的信息String。您还应该正确记录您的方法;您可以记录String或不记录生成的格式,但您至少应该记录您的意图(格式是否会更改或不太可能更改)。

最后,由您(以及您公司的标准)决定是否在每个课程中覆盖它应该成为您习惯的一部分。就个人而言,我不会toString ()在每个类中都覆盖,只在那些最有可能在调试跟踪中使用的类中覆盖。

于 2012-12-13T19:55:37.780 回答
3

我会toString()在任何持有human understandable non confidential data. 例如:传输对象、Beans、数据对象、包装器。对于这样的类,只需继续实现 '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。用户@7852e922

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

注意-当在 System.out.println() 中使用对象时,我们会得到正确的输出,因此重写 toString() 是个好主意;

于 2018-10-20T14:41:52.517 回答