toString 的显式调用与隐式调用

2023-12-22

当需要有关对象的一些调试信息时,我曾经使用 toString 的隐式调用,因为如果对象为 null,它不会抛出异常。

例如:

System.out.println("obj: "+obj);

代替:

System.out.println("obj: "+obj.toString());

除了 null 情况之外还有什么区别吗?
当前一种情况不行时,后一种情况可以吗?

Edit:
在隐式调用的情况下到底做了什么?


差别不大。使用较短且更有效的方法。

如果您确实出于其他原因想要获取对象的字符串值,并且希望它对 null 友好,请执行以下操作:

String s = String.valueOf(obj);

Edit: 问题被扩展了,所以我会扩展我的答案。

在这两种情况下,它们都会编译为如下所示:

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));
}

where 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;
}

所以......这两种情况都会发生非常相似的事情。一个人只需多做一点工作即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

toString 的显式调用与隐式调用 的相关文章

随机推荐