8

我正在关注一个 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值不能自动转换为字符串?

4

5 回答 5

21

这是您可以采用的许多“安全编程”实践之一,以提高清晰度并防止您或您的代码的未来维护者可能引入的细微错误。举个例子:

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为 a String

private static void printMessage2Safe(int k) {
    System.out.println(Integer.toString(k) + '=' + "number");
}   

输出:5=number

“哦,但无论如何我永远不会那样做,”你说。“任何头脑正常的人都会制作=另一个弦乐的一部分。” 但是,如果您正在实现基本计算器应用程序的一部分,并且想要输出表达式及其结果怎么办?如果你真的很小心,我想你会用它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
于 2013-01-02T18:59:32.063 回答
5

是否有充分的理由将 toString() 方法用于非字符串数据类型?

有些人认为它更清楚。尤其是对于可能没有意识到他们做基本相同的事情的初学者。

注意:在 Java 7 更新 9 中,它不会首先创建字符串,因为 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;
}

它将数字海峡转换为 StringBuilder 避免了首先创建 String 的需要。

在我的具体示例中,是否有任何不能自动 toString 的 int 值?

不,所有原始值都可以是 toString'ed。

我知道的唯一例外是信号和安静的 Not-A-Number值,因为 Java 不关心这些事情。两者都显示为“NaN”,并且无法区分与 toString() (或 Java 中的大多数函数)的区别

于 2013-01-02T17:58:36.367 回答
0
System.out.println("The number is " + Integer.toString(k));

在上面的打印中“数字是”是字符串,所以String+(anything)只是字符串。所以在这种情况下根本不需要调用 toString()。所以如果你只想打印 k 值,那么也不需要调用toString() 作为S.O.P内部调用 toString()。

所以最后,我们可以说,除非你特别想将 Integer 转换为 String,否则你不应该调用 toString() 方法。

于 2013-01-02T17:59:05.833 回答
0

使用第二个版本。对于字符串连接表达式,如

"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());
于 2013-01-02T18:31:25.230 回答
-6

它允许数字成为字符串数据类型,所以它都是字符串。正如 Mob 所说,它甚至不是一个整数。您必须先将其解析为整数,然后才能变为整数。

于 2013-01-02T17:59:55.287 回答