我正在学习一个Java教程,它让我做一些类似的事情:
int k = 5;
System.out.println("The number is " + Integer.toString(k));
所以,就像一项很好的运动一样,我一直在坚持,但我忍不住想,为什么要用这种方法呢?似乎需要大量额外的打字才能获得与相同的功能
int k = 5;
System.out.println("The number is " + k);
对于非字符串数据类型,是否有充分的理由使用toString()
方法?在我的具体例子中,有没有int
值不能自动转换为String'ed?
这是您可以采用的许多"安全编程"实践之一,以提高清晰度并防止您或代码的未来维护者可能引入的细微错误。举以下例子:
private static void printMessage(int k) {
System.out.println("number" + '=' + k);
}
输出:number=5
现在假设您想先打印数字,最后打印文本。我所做的只是交换字符串串联中的第一个和最后一个项目:
private static void printMessage2(int k) {
System.out.println(k + '=' + "number");
}
输出:66number
哎呀!=
的int值被添加到k
,而不是被级联。一种解决方案是将=
制成String
。另一种解决方案是显式地将int
转换为String
:
private static void printMessage2Safe(int k) {
System.out.println(Integer.toString(k) + '=' + "number");
}
输出:5=number
"哦,但无论如何,我永远不会那样做,"你说。"任何头脑正常的人都会把=
作为另一个String的一部分。"但是,如果你正在实现一个基本计算器应用程序的一部分,并且你想输出表达式及其结果,该怎么办?如果你真的很小心,我想你会使用StringBuilder.append()
来连接表达式的各个部分。但如果没有,那么我希望您不要在下面编写display
方法的第一个实现。
public class Calculator {
public static void main(String[] args) {
display(2, '+', 3, 5);
displaySafe(2, '+', 3, 5);
}
public static void display(int num1, char operator, int num2, int result) {
System.out.println(num1 + operator + num2 + '=' + result);
}
public static void displaySafe(int num1, char operator, int num2, int result) {
System.out.println(Integer.toString(num1) + operator + Integer.toString(num2) + "=" + result);
}
}
输出:
114
2+3=5
对于非字符串数据类型,是否有充分的理由使用toString((方法?
有些人认为它更清晰。尤其是对于那些可能没有意识到自己做的事情基本相同的初学者。
注意:在Java 7更新9中,它不会首先创建String,因为append(int(看起来像这个
// from AbstractStringBuilder
public AbstractStringBuilder append(int i) {
if (i == Integer.MIN_VALUE) {
append("-2147483648");
return this;
}
int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1
: Integer.stringSize(i);
int spaceNeeded = count + appendedLength;
ensureCapacityInternal(spaceNeeded);
Integer.getChars(i, spaceNeeded, value);
count = spaceNeeded;
return this;
}
它将数字strait转换为StringBuilder,从而避免了首先创建String的需要。
在我的具体例子中,是否有任何int值不能自动转换为String'ed?
没有。所有基元值都可以是toString'ed。
我所知道的唯一例外是发出信号和安静的Not-A-Number值,因为Java并不关心这些事情。两者都显示为"NaN",并且无法区分toString(((或Java中的大多数函数(
System.out.println("The number is " + Integer.toString(k));
在上面的打印中,"数字是"是字符串,因此string+(任何东西(仅为字符串。所以在这种情况下根本不需要调用toString((。因此,如果您只想打印k值,那么也不需要像S.O.P
内部调用toString((那样调用toString。
最后,我们可以说,除非您特别想将Integer转换为String,否则不应该调用toString((方法。
使用第二个版本。对于像这样的字符串连接表达式
"The number is " + k;
javac使用StringBuilder作为构建实际代码
new StringBuilder("The number is ")).append(Integer.toString(k)).toString());
因此System.out.println只是打印得到的字符串,完整的代码是
System.out.println((new StringBuilder("The number is ")).append(Integer.toString(k)).toString());
它允许数字成为String数据类型,因此它都是字符串。正如Mob所说,它甚至不是一个整数。在它变为1之前,您必须将其解析为一个整数。