当我想要一些关于对象的调试信息时,我曾经使用过toString的隐式调用,因为如果对象是null,它不会抛出异常.
例如:
System.out.println("obj: "+obj);
代替:
System.out.println("obj: "+obj.toString());
除了空案例之外还有什么区别吗?
后者的情况可以起作用吗,前者不行吗?
编辑:
在隐式调用的情况下,究竟做了什么?
没有什么区别.使用较短且工作频率较高的那个.
如果您确实想要出于其他原因获取对象的字符串值,并希望它为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; }
所以......两种情况都发生了非常相似的事情.一个人只是做了一点工作.