加引号(+“”)和使用“toString()”方法之间的区别是什么,甚至用(String) myObject
之类的内容显式转换?权衡?
myObject.toString()
VS
myObject+""
甚至vs。
(String) myObject
更具体地说,是否有时间使用myObj+""
方法会让您遇到麻烦?
为了清晰而编辑
编辑2:
似乎String.valueOf(myObj);
是避免空指针的首选方法。那说:以下是假的吗?
String.valueOf(myObj).equals(myObj+"")
答案 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()
方法。它可以用于调试,或用作计算属性,但它应该是人类可读的。根据我的经验,在极少数情况下,不保证对象的人类可读版本。
依赖于重载+运算符感觉就像黑客一样,是的。