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方法,因为它应该是在一行输出诊断信息,或者如果有意义则输出单个文字值。我真的不明白。我应该只打印所有实例变量并让用户决定它是什么吗?
答案 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();
}