Java toString()方法
Java toString方法是一个非常有用的方法,即使您可能不知道它,我也可以肯定您在程序中使用了很多方法。
Java toString方法
首先,让我们确定为什么我之前说过即使您可能不知道toString方法,也是如此。
您是否同意将" System.out.println(object);"用于学习和调试目的?我在早期使用了很多东西,但仍然使用它来调试我的代码(生产前)。
如果仔细观察,则" System.out"是" PrintStream"的实例,并且其" toString"方法的实现方式如下所示。
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
String.valueOf()
实现是这样的:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
因此,最终println()
和print()
函数调用对象的toString()
方法来获取字符串表示形式,然后进行打印。
因此,以下两个语句将产生相同的结果。
System.out.println(object.toString()); System.out.println(object);
现在,我们同意它已被广泛使用,让我们开始更详细地探讨toString方法。
Java Object toString()方法
让我们看一个简单的程序,在该程序中,我们将创建一个Java对象并将其称为toString方法。
package com.theitroad.string; public class JavaToString { public static void main(String[] args) { Data d = new Data(10, "Java"); System.out.println(d); } } class Data { private int id; private String name; Data(int a, String b) { this.id = a; this.name = b; } }
当我运行并编译该程序时,输出为com.theitroad.string.Data @ 7a46a697
。
现在出现两个问题–首先是toString()方法其中实现,因为我在Data类中看不到它?其次是几乎没有任何有意义的信息的输出。
我们知道Java支持继承,而"对象"位于该层次结构的顶层,即实现" toString"方法的位置。
如果您查看Object类toString的实现,则如下所示:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
现在很清楚为什么输出的类名带有@,然后是一个十六进制数。
Java toString()方法要点
现在让我们看一下Object toString()方法javadoc,看看它说了什么。
Java
toString
方法返回对象的字符串表示形式。结果应该是简洁易懂的表示形式,便于人们阅读。
建议所有子类都重写此方法。
基于以上建议,我们几乎应该始终重写toString()方法以返回有关该对象的有用信息。
因此,让我们更改数据类的实现并覆盖它的toString方法。
package com.theitroad.string; public class JavaToString { public static void main(String[] args) { Data d = new Data(10, "Java"); System.out.println(d); } } class Data { private int id; private String name; Data(int a, String b) { this.id = a; this.name = b; } public int getId() { return id; } public String getName() { return name; } /** * Returns JSON string with id and name * Implementation can change in future, not to rely to convert object to JSON */ @Override public String toString() { return "{\"id\":"+id+", \"name\":\""+name+"\"}"; } }
现在,当您运行上述程序时,输出将为{{id":10," name":" Java"}"。
现在,这对于查看输出的任何人都更有意义。
重写toString()方法的要点
让我们看看在覆盖toString()方法时应考虑的一些重要点。
始终将@Override注释与其一起使用,以避免由于错别字而引起的任何错误或者不良结果。
确保仅在toString()方法中返回有用的数据,您的POJO类可能包含一些敏感信息,例如电子邮件ID,SSN编号等。
您应屏蔽它们或者完全避免使用它们,否则它们将被打印在生产服务器日志和导致安全和数据隐私问题。最好提供一些有关toString()方法输出的文档。
例如,某人不应使用我的toString()实现将对象转换为JSON字符串。
因此,我明确添加了实施可能会改变的原因。您应该始终为对象属性提供getter方法,这些对象属性是toString()方法输出字符串的一部分。
否则,由于没有其他选择,程序员将被迫解析toString()输出以获得所需的数据。始终最好提供toString()方法的实现,即使您可能认为它不是必需的。
考虑下面的代码,其中有人在打印数据对象列表。