我什么时候应该覆盖toString()?

时间:2012-12-13 19:46:39

标签: java

我知道Javadocs says

  

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

但是我什么时候应该花时间覆盖我课程的toString方法?它应该是我做的第一件事,其中包括覆盖equalshashCode?或者我应该等到实际需要它?

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

5 个答案:

答案 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>