作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
当我想要一些关于对象的调试信息时,我曾经使用隐式调用 toString,因为如果对象为空,它不会抛出异常。
例如:
System.out.println("obj: "+obj);
代替:
System.out.println("obj: "+obj.toString());
除了null case有什么区别吗?
后一种情况是否可行,而前一种情况则不行?
编辑:
在隐式调用的情况下到底做了什么?
最佳答案
差别不大。使用更短且工作更频繁的那个。
如果您出于其他原因确实想要获取对象的字符串值,并且希望它对 null 友好,请执行以下操作:
String s = String.valueOf(obj);
编辑:问题已扩展,所以我将扩展我的答案。
在这两种情况下,它们都会编译成如下内容:
System.out.println(new StringBuilder().append("obj: ").append(obj).toString());
当你的 toString()
是隐式的,你会在第二个追加中看到。
如果您查看 java 的源代码,您会发现 StringBuilder.append(Object)
看起来像这样:
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
String.valueOf
如下所示:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
现在,如果你自己toString()
,你绕过空检查和堆栈帧,直接在StringBuilder
中进行:
public StringBuilder append(String str) {
super.append(str);
return this;
}
所以...在这两种情况下都会发生非常相似的事情。一个人只是做更多的工作。
关于java - toString 的显式与隐式调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/328661/
我是一名优秀的程序员,十分优秀!