Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是什么Java习语?带串联的字符串构造函数_Java_Idioms - Fatal编程技术网

什么';这是什么Java习语?带串联的字符串构造函数

什么';这是什么Java习语?带串联的字符串构造函数,java,idioms,Java,Idioms,在我正在使用的代码库中,我看到了这个习语的使用。有人能给我解释一下吗 new String("" + number) // `i` is an instance of Integer 对于某些上下文,该方法大致如下所示: public String someMethod(String numberString) { Integer number = new Integer(numberString); // other stuff happens... return n

在我正在使用的代码库中,我看到了这个习语的使用。有人能给我解释一下吗

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);
}

这个习惯用法用于自动将整数
数字
转换为字符串

String
构造函数需要类型为
String
的参数。表达式
新字符串(数字)
将无法编译。合并空字符串是将整数转换为字符串的一个小技巧

当然,您可以使用
newstring(number.toString())
String.valueOf(number)


注意:正如Jon Skeet在评论中提到的,根本不需要使用
new Sring()
。您可以
返回number.toString()
返回字符串。valueOf(number)
此ideom是将任何基元或对象类型转换为字符串的最简单方法

这很简单:键入
“”+number
比键入
String.valueOf(number)
(或
Integer.toString(number)工作量更少
。后者是将
int
转换为
String
的常用方法。哪一种更清晰、更受欢迎是一个品味问题。你会发现这两种版本的拥护者

但请注意三件事:

  • 调用
    String.valueOf(number)
    更快,因为
    “”+number
    将成为字符串串联,它将被编译为

    new StringBuilder().append("").append(number).toString()
    
    但是,除非这条语句在代码中处于热门位置,否则差异根本不重要。即使在热门位置,差异也可能可以忽略不计

  • 简单调用
    number.toString()
    也是一个选项,因为
    number
    是一个带框的整数。但是,如果
    number
    为空,这将触发空指针异常,因此请小心

  • 示例的最后一行,即,
    新字符串(“+number”);
    简直是垃圾!它将结果包装成一个新构建的字符串。这会创建一个不必要的副本并花费宝贵的额外击键。它还会在代码中生成不必要的样板噪声。最后一行编译为:

    new String(new StringBuilder().append("").append(number).toString())
    
    要将
    int
    转换为字符串,这是一项相当艰巨的工作。首先创建一个StringBuilder,然后创建一个生成字符串,然后再创建一个该生成字符串的副本。这将创建三个对象,而不是一个对象


  • 这很可能只是一个没有经验的Java程序员试图将数字转换成字符串

    使用
    “”+number
    将数字转换为字符串是否是一种良好的做法。我发现
    String.valueOf(number)
    更清楚(尽管它在语义上是等效的)


    完全没有必要将结果包装在
    新字符串(…)
    中,除非您(出于某种无法想象的原因)真的需要一个新的字符串,即一个在引用上与其他字符串不同的字符串。

    我想说作者对Java缺乏经验。不知道你为什么会这样做。这只是废话。一旦数字与一个字符串连接起来,就不需要交给另一个字符串的构造函数。这是一个非常糟糕的编程,而且你需要应该删除它。使用
    新字符串(…)
    甚至可以避免实习生池,因此在内存方面不如
    “”+number
    有效。如果我错了,请有人纠正我。@williammerrison只有字符串文字才可以,除非你自己更改代码;)@williammerrison-我认为编译器不会强制转换
    “+someNumber
    转换为字符串文字,但不管怎样,将该值转换为字符串构造函数的参数都是非常愚蠢的。但是为什么
    新字符串(…)
    而不仅仅是
    ”+number
    ?而且
    “+number
    无法像
    number.toString()那样清楚地表达您要做的事情呢
    String.valueOf(number)
    ,我认为
    “+number
    ((整数)number)更清晰
    。无论如何,这基本上是数字到字符串的转换。
    。至于他们为什么使用显式构造函数来创建字符串而不是串接的结果,我自己也不确定。我认为这不应该有什么区别。@Zhuinden
    字符串。valueOf(number)
    更清楚。”“+number
    @Zhuinden:你为什么要先将其转换为
    Integer
    ?没有人建议。
    String.valueOf(number)
    在这种情况下只调用
    number.toString()
    。只要
    number
    是非空的。只要
    number
    没有更改,
    新整数
    就不应该是
    null