我知道Javadocs says:
返回对象的字符串表示形式。一般来说, toString方法返回一个“文本表示”的字符串 宾语。结果应该是简洁但信息丰富的表示 一个人很容易阅读。建议所有人 子类重写此方法。
但是我什么时候应该花时间覆盖我课程的toString
方法?它应该是我做的第一件事,其中包括覆盖equals
和hashCode
?或者我应该等到实际需要它?
我知道Eclipse可以为你自动生成toString
方法,所以一旦我知道了我的类的字段,我是否应该让Eclipse自动生成它们?
答案 0 :(得分:14)
Josh Bloch在Effective Java第10项中给出了一个很好的解释。
[...]提供良好的toString实现使您的课程更加愉快。
它确实可以更容易地输出调试跟踪,或者生成更好的日志消息,因为您可以直接使用toString()
提供的对象的字符串表示形式;您不必手动构建一个字符串,该字符串提供对象所需的信息。
如书中所述,您应该在生成的String
中包含所有有趣的信息。您还应该正确记录您的方法;您可以记录生成的String
格式,但至少应该记录您的意图(格式是否可以更改,或者不可能更改)。
最后,由您(以及您公司的标准)决定是否在每个课程中覆盖它应该是您的习惯的一部分。就个人而言,我不会在每个类中覆盖toString ()
,只会在最有可能被用于调试跟踪的那些类中。
答案 1 :(得分:2)
我会在任何包含toString()
的类上实现human understandable non confidential data
方法。例如:传输对象,Bean,数据对象,包装器。对于这样的类,只需继续实现'toString()'方法。
表示服务的类,具有瞬态的进程无需实现该方法。这里,您可以等到实际需要它。
确保不在'toString()'中使用“transient”关键字公开任何变量!
答案 2 :(得分:1)
通常,当我想指定显示对象的默认格式时,我会覆盖它,通常格式化相关属性的紧凑/可摘取显示。因此,我可以简单地通过执行以下操作在调试或日志中显示它:
MyClass myClsInst = new MyClass();
...
System.out.println(myClsInst);
答案 3 :(得分: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格式操作数据会更加容易。
答案 4 :(得分: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中获取对象哈希代码
O / P 没有覆盖toString()方法-com.web.doamin。 User @ 7852e922
如果我们覆盖ToString()方法,我们将获得O / P-用户[user = null,id = 0]
注意-当在System.out.println()中使用对象时,我们会得到正确的输出,因此重写toString()是个好主意。 < / p>