是否与空字符串连接进行字符串转换真的那么糟糕?

pol*_*nts 40 java string coding-style

假设我有两个char变量,后来我想将它们连接成一个字符串.我就是这样做的:

char c1, c2;
// ...

String s = "" + c1 + c2;
Run Code Online (Sandbox Code Playgroud)

我见过有人说"" +"诡计"是"丑陋"等等,你应该使用String.valueOfCharacter.toString代替.我更喜欢这种结构,因为:

  • 如果可能的话,我更喜欢使用语言功能而不是API调用
    • 一般来说,语言通常不比API更稳定吗?
    • 如果语言功能只隐藏API调用,那么更有理由更喜欢它!
      • 更抽象!隐藏很好!
  • 我喜欢它,c1并且c2在视觉上处于同一水平
    • String.valueOf(c1) + c2 建议一些特别的东西 c1
  • 它更短.

真的有一个很好的论据为什么String.valueOf或者Character.toString更喜欢"" +


琐事:在java.lang.AssertionError,下面一行出现7次,每次都有不同的类型:

    this("" + detailMessage);
Run Code Online (Sandbox Code Playgroud)

Jos*_*Lee 26

你的论点很好; 这是Java语言中更具表现力的领域之一"" +,正如您所发现的那样,成语似乎根深蒂固.

请参阅JLS中的字符串连接.一个表达式

"" + c1 + c2
Run Code Online (Sandbox Code Playgroud)

相当于

new StringBuffer().append(new Character(c1).toString())
                  .append(new Character(c2).toString()).toString()
Run Code Online (Sandbox Code Playgroud)

除了不需要所有中间对象(因此效率不是动机).规范说实现可以使用StringBuffer或不使用.由于此功能已内置于语言中,因此我认为没有理由使用更详细的表单,尤其是在已经详细的语言中.

  • 实际上,没有.JLS以这种方式解释它,但编译器以不同方式实现它.Eclipse编译器生成相当于新StringBuilder()的字节码.append(c1).append(c2).toString()javac编译器(1.5)生成相当于新StringBuilder()的字节码.append("").append(c1) .append(C2)的ToString() (7认同)

Joa*_*uer 19

该构造的问题在于它通常不表达意图.

它表示String与另一个值的串联,但串联通常不是此行的目标.

在您演示的特定情况下,连接实际上是目标,因此此代码确实表达了意图.

在这种方法(String s = "" + intValue;)的更常见的使用中,连接仅仅是容忍的副作用,而转换intValue是实际目标.而一个简单的String.valueOf(intValue)表达意图更加清晰.

  • 我不这么认为.`""+ x`非常常见,意图应该清楚. (8认同)
  • @mafutrct:如果只是在你之前已经多次看过那个精确构造时才清楚意图,那么就不清楚了.它只能证明模式识别有效. (8认同)
  • @Chris:让我试着改写你的论点:"这不是丑陋的,因为它很常见." 这对我来说听起来不对. (2认同)

Jon*_*eet 5

我更喜欢将其String.valueOf用于单次转换-但在您的情况下,您确实需要串联。

但是,我建议此版本将消除所有潜在的歧义:

String s = c1 + "" + c2;
Run Code Online (Sandbox Code Playgroud)

这样一来,就不可能有人在串联之前考虑是否将c1和c2加在一起。