Java toString的显式调用与隐式调用
我曾经在需要关于对象的一些调试信息时使用toString的隐式调用,因为如果对象为null,它不会引发异常 例如:Java toString的显式调用与隐式调用,java,tostring,Java,Tostring,我曾经在需要关于对象的一些调试信息时使用toString的隐式调用,因为如果对象为null,它不会引发异常 例如: System.out.println("obj: "+obj); 而不是: System.out.println("obj: "+obj.toString()); 除了空的情况,还有什么不同吗? 后者能起作用吗,而前者不行 编辑: 在隐式调用的情况下,具体执行什么操作?没有区别,就像您所说的,除了空安全性。总是喜欢前者而不是后者。没有什么区别。使用较短且更有效的 如果出于其他原
System.out.println("obj: "+obj);
而不是:
System.out.println("obj: "+obj.toString());
除了空的情况,还有什么不同吗?后者能起作用吗,而前者不行 编辑:
在隐式调用的情况下,具体执行什么操作?没有区别,就像您所说的,除了空安全性。总是喜欢前者而不是后者。没有什么区别。使用较短且更有效的 如果出于其他原因确实希望获取对象的字符串值,并且希望该值为空友好型,请执行以下操作:
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));
}
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
其中String.valueOf
如下所示:
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
现在,如果您自己toString()
,您可以绕过空检查和堆栈帧,直接在StringBuilder
中执行此操作:
public StringBuilder append(String str) {
super.append(str);
return this;
}
所以…在这两种情况下都会发生非常相似的事情。一个人只需要多做一点工作。正如其他人所说的那样-使用
“+obj
方法
根据报告:
- 如果术语为空,请使用
“空”
- 基本类型是使用盒式类型构造函数
或其他方法转换的新布尔值(X)
- 调用了
(或等效程序)toString()
- 如果
的结果为toString()
,请使用null
“null”
- 连接字符串
class ref
{
static public class Reference<T>
{
private T value;
public Reference(T value) { set(value); }
public Reference() { set(null); }
public void set (T value) { this.value = value; }
public T get () { return this.value; }
public String toString() { return String.valueOf(this.value); }
}
static void fillString (Reference<String> str)
{
str.set("foo");
}
public static void main (String[] args)
{
Reference<String> str = new Reference<String>("");
fillString(str);
System.out.println (str);
}
}
你名单上的第四项引起了我的兴趣。对于不是字符串的内容,它会附加String.valueOf(String.valueOf(ob))。我想它很便宜,符合要求。嘿嘿,漂亮。老实说,我也不知道,直到我看了规范之后——区别从来都不重要。这是一个很好的例子,说明了如果可以的话,为什么我总是去主要来源。