在Java中,使用toString方法与显式字符串转换与加引号(例如myObj +“”)之间有什么区别?

时间:2015-10-14 16:43:26

标签: java casting jvm

加引号(+“”)和使用“toString()”方法之间的区别是什么,甚至用(String) myObject之类的内容显式转换?权衡?

myObject.toString()

VS

myObject+""

甚至vs。

(String) myObject

更具体地说,是否有时间使用myObj+""方法会让您遇到麻烦?

为了清晰而编辑

编辑2:

似乎String.valueOf(myObj);是避免空指针的首选方法。那说:以下是假的吗?

String.valueOf(myObj).equals(myObj+"")

3 个答案:

答案 0 :(得分:3)

从Java 7开始,如果你想避免NullPointerException,你可以简单地使用以下方法之一:

Objects.toString( myObject )
Objects.toString( myObject, "defaultValueWhenMyObjectIsNull" )

在Java的所有版本中,第一个也可以使用以下内容完成,如下面第一条评论中@NobuGames所述:

String.valueOf( myObject )

你引用的机制都存在缺陷。

 myObject.toString()  // throws NullPointerException if myObject is null.
 myObject+""          // Hack; impairs understandability.
 (String) myObject    // throws ClassCastException unless myObject is a String or null

编辑(问题编辑后)

  

有没有时间使用myObj +“”方法会让你陷入困境?

是的,你可以混淆其他程序员。黑客的目的不明确。这可能导致成本增加,并增加某人“修理”它的风险。

但是,就编译器而言,你没问题。来自Java Language Specification, section 15.18: String concatentation operator +

  

如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。

从引用的5.1.11: String conversion部分开始:

  
      
  • 如果引用为null,则将其转换为字符串“null”(四个ASCII字符n,u,l,l)。

  •   
  • 否则,转换的执行就好像通过调用没有参数的引用对象的toString方法一样;但是如果调用toString方法的结果为null,则使用字符串“null”。

  •   

第二种情况会导致您提出的不同之处。

  

有没有时间以下是假的? String.valueOf(myObj).equals(myObj+"")

不,但是有一段时间会抛出NullPointerException。当myObj是对toString()方法返回null的对象的非空引用时,String.valueOf(myObj)将为null。调用equals方法将抛出NullPointerException。

但我怀疑你在问这两个人是否有不同的价值观。是的,他们可以有不同的价值观。 Objects.toString()String.valueOf()可以返回空值。黑客将始终具有非空值。

也就是说,从toString()返回null是一种不好的形式。 JLS承认它可能发生,但API意味着它不应该发生。就个人而言,如果我担心这个案子,我会以某种方式处理它而不是黑客。

答案 1 :(得分:2)

此代码:

myObject+""

由编译器翻译成:

new StringBuilder().append(myObject).append("").toString()

StringBuilder append方法对输入参数进行空检查,并附加文本“null”。

String类有一个重载的valueOf方法,所以你也可以这样做:

String.valueOf(myObject)

将执行空检查,返回文本“null”。

答案 2 :(得分:0)

Casting to String将具有高度的上下文,因此这里可能会应用多种技术。如果您希望直接转换为String,我的建议是为它做准备。如果有可能它为null,那么检查它。或者让API承诺不要给你一个null。也就是说,这是关注点的分离和责任的分层。

然而,IMO,任何足够复杂的类都应该有toString()方法。它可以用于调试,或用作计算属性,但它应该是人类可读的。根据我的经验,在极少数情况下,不保证对象的人类可读版本。

依赖于重载+运算符感觉就像黑客一样,是的。