将原始数据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问题?