当需要有关对象的一些调试信息时,我曾经使用 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;
}

所以...非常类似的事情发生在这两种情况下。一个只是做了一点更多的工作。

其他提示

正如其他人所说 - 使用 "" + obj 方法。

根据 Java语言规范:

  • 如果该术语为空,则使用 "null"
  • 使用装箱类型构造函数转换原始类型 new Boolean(X) 管他呢
  • toString() 被调用(或等效)
  • 如果 结果toString()null, , 使用 "null"
  • 连接字符串。

除了,像你说的没有什么区别,空安全。总是喜欢前者到后者。

其实,如果你不变说,对象不应该是零,也没有关系。所以,这取决于你是否不能接受的obj为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);
  }
}

运行它给所需要的输出:

javac ref.java && java ref
foo
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top