什么应该包含在toString方法中,什么不应该包含?

时间:2014-02-02 21:11:30

标签: java tostring

    public String toString() {
        String info = "";
        String courseInfo = this.getCourseInfo();
        if("".equals(courseInfo)) {
            courseInfo = "None";
        }

        info += "--------------------------------------------------\n";
        info += "Student Name: " + this.name + "\n";
        info += "Student Address: " + this.address + "\n"; 
        info += "Student #: " + this.studentNumber + "\n";
        info += "Student Login ID: " + this.loginID + "\n";
        info += "Courses taken:" + "\n";
        info += courseInfo + "\n";
        info += "GPA: " + this.getGPA() + "\n";
        info += "--------------------------------------------------\n";

        return info;
    }

我被告知这是一个糟糕的toString方法,因为它应该是在一行输出诊断信息,或者如果有意义则输出单个文字值。我真的不明白。我应该只打印所有实例变量并让用户决定它是什么吗?

2 个答案:

答案 0 :(得分:3)

问题是这个toString会产生一大块代码。让我们说它叫做学生。如果你想记录:

Student X linked to student Y because of Z.

然后X和Y将变得庞大,并且整条线被拆分并且不可读。

你可能有一个“toFullDescription”或类似当前toString的方法,但是toString应该只有一些有意义的元素,可能只是花括号内的名字和Id。

答案 1 :(得分:1)

您在toString中输入了您认为与该对象相关的任何信息。它对于调试目的非常重要,例如IDE中的日志文件或调试会话。此外,写入日志的toString对象中的信息在尝试识别应用程序中的问题时对取证非常有用。

但是,您可能会尝试避免在那里放置敏感信息(例如密码,信用卡号等)。

我喜欢将Apache Commons EqualsBuilder class用于此类事情。它为您的toString提供了不同的格式样式,使您的生活更简单。

例如:

@Override
public String toString(){
 return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
              .append("orderId", this.orderId)
              .append("status", this.status)
              .append("type",this.type)
              .append("items", this.items)
              .toString();
 }