Java toString()方法

时间:2020-02-23 14:36:58  来源:igfitidea点击:

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,看看它说了什么。

  • JavatoString方法返回对象的字符串表示形式。

  • 结果应该是简洁易懂的表示形式,便于人们阅读。

  • 建议所有子类都重写此方法。

基于以上建议,我们几乎应该始终重写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()方法的实现,即使您可能认为它不是必需的。
    考虑下面的代码,其中有人在打印数据对象列表。