代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

用空字符串连接来进行字符串转换真的那么糟糕吗?

  •  39
  • polygenelubricants  · 技术社区  · 15 年前

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

    char c1, c2;
    // ...
    
    String s = "" + c1 + c2;
    

    我见过有人说 "" + “诡计”是“丑陋”等,你应该使用 String.valueOf Character.toString 相反。我更喜欢这种结构,因为:

    • 如果可能的话,我更喜欢使用语言特性而不是api调用
      • 一般来说,这种语言不比api更稳定吗?
      • 如果语言特性只隐藏了api调用,那么选择它的理由就更充分了!
        • 更抽象!躲起来很好!
    • 我喜欢这个 c1 c2 在视觉上处于同一水平
      • String.valueOf(c1) + c2 暗示一些特别的东西 C1
    • 它比较短。

    有什么好的理由 字符串.valueof 字符.tostring 更愿意 “+” ?


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

        this("" + detailMessage);
    
    9 回复  |  直到 10 年前
        1
  •  25
  •   Josh Lee ZZ Coder    15 年前

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

    String concatenation 在JLS中。像这样的表情

    "" + c1 + c2
    

    相当于

    new StringBuffer().append(new Character(c1).toString())
                      .append(new Character(c2).toString()).toString()
    

    但所有的中间目标都是不必要的(所以效率不是动机)。规范指出,实现可以使用 StringBuffer 或者没有。由于这个特性是内置在语言中的,所以我认为没有理由使用更详细的形式,特别是在已经很详细的语言中。

        2
  •  19
  •   Joachim Sauer    15 年前

    这个结构的问题是它通常不能表达意图。

    它表示字符串与另一个值的连接,但连接通常不是此行的目标。

    在您演示的特定情况下,连接实际上是目标,所以这段代码 表达意图。

    在更常见的情况下( String s = "" + intValue; ,concateration只是一个可容忍的副作用,而 intValue 才是真正的目标。一个简单的 String.valueOf(intValue) 更清楚地表达了这一意图。

        3
  •  4
  •   Jon Skeet    15 年前

    我更喜欢用 String.valueOf 对于 单一的 转换-但在您的情况下,您真的需要连接。

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

    String s = c1 + "" + c2;
    

    这样就不可能有人考虑c1和c2在连接之前是否会被加在一起。

        4
  •  2
  •   mafu    15 年前

    在我看来, "" + x 是非常可读的,简短的,精确到要点。我宁愿它比像 String.valueOf . 这种行为定义得很好,而且使用得非常普遍,我觉得很难称之为黑客行为。

    我唯一会稍微担心的是性能——而且非常肯定的是,这通常并不重要(即使我没有测量或查看二进制)。这种concat也很有可能被优化掉,因为它应该很容易被检测到(不过这只是一个猜测)。

        5
  •  2
  •   Bozho    15 年前

    我认为在 "" + var 这个 + 实际重载以进行转换:

    Java语言为字符串级联操作符(+)提供了特殊的支持,并将其他对象转换为字符串。字符串连接是通过stringbuilder(或stringbuffer)类及其append方法实现的。字符串转换是通过对象ToString实现的,由对象定义并由Java中的所有类继承。有关字符串连接和转换的其他信息

    所以从技术角度来说没有区别也没有问题。

    形成一个可读性的观点-这是一个个人偏好的问题或在团队中商定的编码风格。

        6
  •  2
  •   whiskeysierra    15 年前

    怎么样

    new String(new char[] {a, b})
    

    如果你经常这样做,你可以创建一个类“strings”,其中包括:

    public static String valueOf(char... chars) {
        return new String(chars);
    }
    

    你的台词是

    String s = Strings.valueOf(a, b);
    

    又短又好。

    编辑

    一个更好的名字可能是:

    String s = Chars.asString(a, b);
    
        7
  •  1
  •   Dean J    15 年前

    除非你的应用程序需要每一盎司的性能,否则请编写更快速、更易于阅读的代码。+是执行语法的速度较慢,但每次使用它时似乎都更容易阅读。

        8
  •  1
  •   Chris    10 年前

    这个 "" + var 在我看来,风格有一个很大的问题。它只是使用了 var . 因此,如果将var的类型更改为其他类型,则不会出现异常。我刚刚遇到的一个很好的例子是类型从 int Optional<Integer> . 代码仍然编译得很好,但是得到的结果完全不同。

        9
  •  0
  •   Evgeniy Dorofeev    12 年前

    最好的方法是编译/反编译代码,我使用jad http://en.wikipedia.org/wiki/JAD_(JAva_Decompiler )为此,您将看到您的表达式已转换为

    字符串s=(new stringbuilder()).append(“”).append(ci).append(c2).tostring();

    正如您所看到的,javac实际上包含了append(“”)调用,但是它的成本可以忽略不计,注意要附加到内部的stringbuilder缓冲区,您可以检查stringbuilder的源代码

    推荐文章