当前位置:  开发笔记 > 编程语言 > 正文

toString的显式vs隐式调用

如何解决《toString的显式vs隐式调用》经验,为你挑选了1个好方法。

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

例如:

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

代替:

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

除了空案例之外还有什么区别吗?
后者的情况可以起作用吗,前者不行吗?

编辑:
在隐式调用的情况下,究竟做了什么?



1> Dustin..:

没有什么区别.使用较短且工作频率较高的那个.

如果您确实想要出于其他原因获取对象的字符串值,并希望它为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;
}

所以......两种情况都发生了非常相似的事情.一个人只是做了一点工作.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有