Java 我应该何时重写toString()?
我知道: 返回对象的字符串表示形式。总的来说 toString方法返回一个字符串,该字符串“以文本形式表示”此 对象结果应该是简洁但信息丰富的表示 这对一个人来说很容易阅读。建议所有 子类重写此方法 但是,我应该在什么时候为我的类重写Java 我应该何时重写toString()?,java,Java,我知道: 返回对象的字符串表示形式。总的来说 toString方法返回一个字符串,该字符串“以文本形式表示”此 对象结果应该是简洁但信息丰富的表示 这对一个人来说很容易阅读。建议所有 子类重写此方法 但是,我应该在什么时候为我的类重写toString方法呢?这应该是我在重写equals和hashCode时首先做的事情之一吗?或者我应该等到真正需要的时候 我知道Eclipse可以为您自动生成toString方法,所以我应该在知道类的字段后让Eclipse自动生成它们吗?Josh Bloch在第10
toString
方法呢?这应该是我在重写equals
和hashCode
时首先做的事情之一吗?或者我应该等到真正需要的时候
我知道Eclipse可以为您自动生成
toString
方法,所以我应该在知道类的字段后让Eclipse自动生成它们吗?Josh Bloch在第10项中给出了很好的解释
[…]提供一个好的toString实现可以使您的类更易于使用
由于可以直接使用toString()
提供的对象的字符串表示形式,因此它确实可以更容易地输出调试跟踪,或者生成更好的日志消息;您不必手动构建提供对象所需信息的字符串
如本书所述,您应该在生成的字符串中包含所有有趣的信息。你也应该适当地记录你的方法;您可以记录生成的字符串
格式,也可以不记录,但至少应该记录您的意图(无论格式是否可能更改)
最后,由你(和你公司的标准)来决定是否在每门课上都将其作为你习惯的一部分。就个人而言,我不会在每个类中重写toString()
,只在那些最有可能被用于调试跟踪的类中重写 我将在任何包含人类可理解的非机密数据的类上实现toString()
方法。例如:传输对象、bean、数据对象、包装器。对于此类类,只需继续实现“toString()”方法
表示具有瞬态的服务、进程的类不需要实现该方法
确保不要在“toString()”中公开任何带有“transient”关键字的变量 通常,当我想要指定显示对象的默认格式时,我会覆盖它,通常会格式化相关属性的紧凑/可消化显示。因此,我可以简单地(例如)通过执行以下操作在调试或日志中显示它:
MyClass myClsInst = new MyClass();
...
System.out.println(myClsInst);
我试着用简单的方式来演示
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[User=null,id=0]
注意-重写toString()是一个好主意,因为当在System.out.println()中使用对象时,我们可以获得正确的输出 通常,它用于显示或查看对象的内容
例如,假设有一个学生类,您创建了对象
学生班级有年龄、年级、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;
}
}
你创造了一个学生和一个B学生(也许更多)
您只需使用“toString()”检查其内部,如下所示:
System.out.println(aStudent.toString());
System.out.println(bStudent.toString());
Output:
age is 13, grade is 3, ...
age is 15, grade is 5, ...
或者您可以只写对象名,它会自动调用“toString()”
它可以更快地消除冗余工作
然后,您将看到如下所示:
System.out.println(aStudent.toString());
System.out.println(bStudent.toString());
Output:
age is 13, grade is 3, ...
age is 15, grade is 5, ...
当您在调试时看到一个学生或B学生拥有什么时,它非常有用
而且,当您创建自己的表单(如JSON)时,它也很有用
使用JSON格式操作其数据会更容易。我很少这样做,如果我这样做是为了调试,因为现代IDE可以马上为您生成此方法,如果您希望打印对象,为什么不使用它呢?忽略自动生成的可能性,这取决于您。香草toString只打印出对象类和散列标识符。如果您想使用toString进行诊断打印,那么值得添加您自己的,以在rational presentation中打印出对象的重要字段。或者,根据经验,大约是您第三次使用println打印出对象的多个字段,现在是编写您自己的toString的时候了。看看哪种方法可以基于添加到类中的单个@toString
注释动态生成您的toString()
方法。这比Eclipse的代码生成更好,因为它在您更改类的字段后自动调整代码。+1大多数IDE都可以为您生成toString()。当我认为我可能会使用它时,我倾向于创建一个。