当需要将原语转换为字符串时,例如传递给需要字符串的方法,基本上有两种选择。
举int
个例子,给定:
int i;
我们可以做以下之一:
someStringMethod(Integer.toString(i));
someStringMethod(i + "");
第一个是“正式”方法,第二个似乎有点“hack”。
当然,代码更少,更容易阅读“hack”恕我直言。
但是使用“hack”是“好”的编码风格吗?
当需要将原语转换为字符串时,例如传递给需要字符串的方法,基本上有两种选择。
举int
个例子,给定:
int i;
我们可以做以下之一:
someStringMethod(Integer.toString(i));
someStringMethod(i + "");
第一个是“正式”方法,第二个似乎有点“hack”。
当然,代码更少,更容易阅读“hack”恕我直言。
但是使用“hack”是“好”的编码风格吗?
这不是一个好主意,但它不会是非常有害的。
在这两个示例Integer.toString()
中,JVM 都调用了它(即使在第一种情况下不是直接调用)。
在第二个示例中,JVM 可能会构造两个字符串,然后生成连接的结果。根据优化,这可能会导致 0、1 或 2 个额外的字符串进行垃圾收集。
从代码编写的角度来看,第三个更短,但对于正在发生的事情也可能不太透明。
第二种方法在可读性方面的问题如下:
int i = 1, j = 2;
someStringMethod(i + j + "" + i + j + "");
产生:
someStringMethod(312);
并不是
someStringMethod(33);
将 * 转换为 String 的最佳方法是使用:
String.valueOf(x)
它适用于实现的原始类型、包装类和对象toString()
。
其中 x 是任何类型的基元或对象。如果为 null,则返回字符串“null”。
这是最好的原因,因为使用“+”操作数意味着字符串连接,加上“”意味着字符串实例化。如果您使用 ""+something 反编译一个类,您会看到编译器将其转换为多个操作。
"" 连接结果相同,String.valueOf()
但它有点贵。性能差异可能可以忽略不计,但是当有更好的方法时,优秀的程序员不会编写 '"" + something' 来将某些内容转换为字符串,而这恰好是正确的方法:)。
对于数组,请查看Arrays.toString()和 -better- Arrays.deepToString()
但是使用“hack”是“好”的编码风格吗?
有时语法 hack 会使代码变得更好。但是上面的案例并不是真正的案例之一。"" 连接不被认为是好的代码。
一个有用的句法技巧的例子是双括号实例化:
List<String> list = new ArrayList<String>() {{
add("foo");
add("bar");
add("baz");
}};
代替
List<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");
""+something 更像是一种代码味道,而不是提高可读性的 hack;任何有经验的人都会想到缺乏 API 和语言知识的 Java 开发人员。
其他有趣的“hacks”是流畅的 API(如 Mockito)、dsl 或 lambda4j 之类的东西,这是一个相当不错的 hack。
当使用 + 号形成字符串时,jvm 会创建一个中间字符串/字符串缓冲区对象来进行转换,这不是最佳方式。此外,+ 符号是左关联的,所以当用于像 “”+1+2这样的表达式时,将产生 12 而不是“3”。所以最好使用 String.toValue() 或 Type.toString()。
java中的连接符号是+。因此,您将结果转换 (i + "")
为字符串,因为您在示例代码中将一个空字符串连接到一个数字。
这两种方法都很好,但我通常使用String.valueOf(x);