【问题标题】:What's this Java idiom? String constructor with concatenation这是什么 Java 习语?具有连接的字符串构造函数
【发布时间】:2014-08-28 10:38:33
【问题描述】:

在我正在使用的代码库中,我看到有人在使用这个成语。有人可以为我解释一下吗?

new String("" + number) // `i` is an instance of Integer

对于某些上下文,这大致是该方法的样子:

public String someMethod(String numberString) {
    Integer number = new Integer(numberString);
    // other stuff happens...
    return new String("" + number);
}

【问题讨论】:

  • 我会说作者对 Java 缺乏经验。不知道你有什么理由这样做。
  • 这只是废话。一旦将数字与字符串连接起来,就不需要将其交给另一个字符串的构造函数。这是非常糟糕的编程,你应该删除它。
  • 使用new String(...) 甚至可以避免实习池,因此在内存方面的效率低于"" + number。如果我在这里弄错了,请有人纠正我。
  • @WilliamMorrison 只有字符串字面量才可以,除非您自己更改了代码;)
  • @WilliamMorrison - 我认为编译器不会将""+someNumber 转换为字符串文字,但无论如何转身并使用该值作为字符串构造函数的参数是非常愚蠢的。跨度>

标签: java idioms


【解决方案1】:

这很可能只是没有经验的 Java 程序员尝试将数字转换为字符串。

使用"" + number 将数字转换为字符串是否是好的做法is debateable。我觉得String.valueOf(number) 更清楚(尽管它在语义上是等效的)。

完全没有必要将结果包装在new String(...) 中,除非您(出于某种难以想象的原因)确实需要一个新字符串,即一个在引用上不同于其他字符串的字符串。

【讨论】:

  • String.valueOf(number) 在这种情况下只会调用 number.toString()
  • 对。只要number 不为空。
  • 只要number 没有改变,new Integer(s) 就永远不应该是null
【解决方案2】:

这个理念是将任何原始类型或对象类型转换为字符串的最简单方法。

这很简单:输入"" + number 比输入String.valueOf(number)(或Integer.toString(number))工作量少。后者是将int 转换为String 的常用方法。哪个更清晰,更首选是口味问题。您会找到两种版本的拥护者。

但要注意三点:

  1. 调用String.valueOf(number)比较快,因为"" + number会变成字符串拼接,会被编译成

    new StringBuilder().append("").append(number).toString()
    

    但是,除非此语句在您的代码中处于热门位置,否则差异根本不重要。即使在炎热的地方,差异仍然可以忽略不计

  2. 简单地调用number.toString() 也是一个选项,因为number 是一个装箱的整数。但是,如果number 为null,则会触发空指针异常,请注意!

  3. 您的示例的最后一行,即new String("" + number); 简直是废话!它将结果包装成一个新构建的字符串。这会创建不必要的副本并花费宝贵的额外按键。它还会在您的代码中产生不必要的样板噪音。最后一行编译为:

    new String(new StringBuilder().append("").append(number).toString())
    

    int 转换为字符串是相当多的工作。您首先创建一个 StringBuilder,然后是一个构建的 String,然后是这个构建的 String 的副本。这将创建三个对象而不是一个。

【讨论】:

  • 但为什么是new String(...) 而不仅仅是"" + number
  • "" + number 并没有像 number.toString()String.valueOf(number),IMO 那样清楚地表达你想要做的事情。
  • 我觉得""+number 还是比((Integer)number).toString(); 更清晰。无论如何,它基本上是number to String conversion。至于为什么他们使用显式构造函数来创建 String 而不是串联的结果,我自己也不确定。我不认为它应该有所作为。
  • @Zhuinden String.valueOf(number)"" + number 更清晰
  • @Zhuinden:你为什么要先把它投给Integer?没有人建议这样做。
【解决方案3】:

该习语用于自动将整数number 转换为字符串。

String 构造函数需要String 类型的参数。表达式 new String(number) 不会编译。连接一个空字符串是把 Integer 变成 String 的一个小技巧。

您当然可以改用new String(number.toString())String.valueOf(number)

注意: 正如 Jon Skeet 在 cmets 中提到的,根本不需要使用 new Sring()。你可以return number.toString();return String.valueOf(number)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2012-05-21
    • 2015-05-20
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多