将原始数据types转换为String的更好方法是什么?

我可以使用一个整数转换成string

String s = "" + 4; // correct, but poor style or String u = Integer.toString(4); // this is good 

我可以使用一个double转换成string

 String s = "" + 4.5; // correct, but poor style or String u = Double.toString(4.5); // this is good 

我可以使用String s = "" + data方法将int或double转换为String。 而如果我想使用其他的方法使用toString()我必须使用每个数据types的Wrapper类。 那么为什么在一些书中提到,第一种方法是穷人,而第二种方法是更好的。 哪一个是更好的方法,为什么?

我会用

 String.valueOf(...) 

您可以对所有types使用相同的代码,但不要使用可怕的无意义string连接。

请注意,它也正是你想要的 – 与给定原始值对应的string值。 与"" + x方法比较,即使你没有连接任何东西的意图,那么你应用了string连接,而空string与你无关。 (这可能是更昂贵的,但这是可读性打击,我不介意比性能。)

怎么样String.valueOf() ? 对于所有基元types,它被覆盖重载,对于引用types,将其委托给toString()

 String s = "" + 4; 

编译到这个代码:

 StringBuffer _$_helper = new StringBuffer(""); _$_helper.append(Integer.toString(4)); String s = _$_helper.toString(); 

显然这是相当浪费的。 请记住,在场景后面,编译器总是使用StringBuffers,如果你在String中使用+

还有第三个 – String.valueOf(..) (它调用Wrapper.toString(..)

实际上编译器在这些地方添加了Wrapper.toString(..) ,所以在字节码方面是一样的。 但是""+x是丑陋的。

string连接的方式创build一个额外的对象(然后得到GCed),这是为什么它被认为是“穷”的一个原因。 再加上它更棘手,可读性更差,正如Jon Skeet指出的,通常是一个更大的考虑因素。

我也会使用String.valueOf()方法,它实际上使用了原始types的Wrapper对象,并为你调用了toString()方法:

例如,在String类中:

 public static String valueOf(int i) { return Integer.toString(i, 10); } 

追加双引号是一个不好的方法,特别是为了可读性。 我会考虑使用一些Apache util类进行转换,或者编写自己的工具方法来完成这种types的工作。

你最好意识到你试图转换为string的参数的types,并让编译器知道types。 这简化了操作以及周期。 当你遵循append方法时,你将把types决定留给编译器,并增加编译器的代码行。

我认为答案真的取决于你想要转换什么,以及为了什么目的,但总的来说,我不是做赤裸裸的转换的大粉丝,因为在大多数情况下,转换为string是为了logging,或者其他人的可读性目的。

 MessageFormat.format("The value of XYZ object is {0}", object); 

这提供了良好的可读性,对输出格式的精细控制,重要的是,可以通过用消息包引用replacestring来实现国际化。

需要我提到这也避免了调用object.toString()可能的NPE问题?