Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java toString的显式调用与隐式调用_Java_Tostring - Fatal编程技术网

Java toString的显式调用与隐式调用

Java toString的显式调用与隐式调用,java,tostring,Java,Tostring,我曾经在需要关于对象的一些调试信息时使用toString的隐式调用,因为如果对象为null,它不会引发异常 例如: System.out.println("obj: "+obj); 而不是: System.out.println("obj: "+obj.toString()); 除了空的情况,还有什么不同吗? 后者能起作用吗,而前者不行 编辑: 在隐式调用的情况下,具体执行什么操作?没有区别,就像您所说的,除了空安全性。总是喜欢前者而不是后者。没有什么区别。使用较短且更有效的 如果出于其他原

我曾经在需要关于对象的一些调试信息时使用toString的隐式调用,因为如果对象为null,它不会引发异常

例如:

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”
  • 连接字符串

事实上,如果不变量说对象永远不应该为空,那没关系。因此,这取决于您是否接受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);
  }
}

你名单上的第四项引起了我的兴趣。对于不是字符串的内容,它会附加String.valueOf(String.valueOf(ob))。我想它很便宜,符合要求。嘿嘿,漂亮。老实说,我也不知道,直到我看了规范之后——区别从来都不重要。这是一个很好的例子,说明了如果可以的话,为什么我总是去主要来源。