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自動toStringできない値はありますか?

4

5 に答える 5

21

これは、明確さを向上させ、コードの将来のメンテナがもたらす可能性のある微妙なエラーを防ぐために採用できる多くの「安全なプログラミング」手法の1つです。次の例を見てください。

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値は、連結される代わりに=に追加されました。k1つの解決策は、をにすること=ですString。別の解決策は、を明示的に:に変換するintことです。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に変換し、最初に文字列を作成する必要をなくします。

そして、私の特定の例では、自動toString化できないint値はありますか?

いいえ。すべてのプリミティブ値をtoStringすることができます。

私が知っている唯一の例外は、Javaがそのようなことを気にしないので、シグナリングと静かなNot-A-Number値です。どちらも「NaN」として表示され、toString()(またはJavaのほとんどの関数)との違いを区別する方法はありません。

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

上記の印刷では、 「数値は」は文字列であるため、String +(anything)文字列のみです。その場合、toString()を呼び出す必要はありません。したがって、k値のみを出力する場合は、呼び出す必要もありません。 toString()は、内部的にtoString()をS.O.P呼び出します。

したがって、最後に、特に整数を文字列に変換する場合を除いて、toString()メソッドを呼び出さないでください。

于 2013-01-02T17:59:05.833 に答える
0

2番目のバージョンを使用します。次のような文字列連結式の場合

"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が言ったように、そもそも整数ではありません。1になる前に、整数に解析する必要があります。

于 2013-01-02T17:59:55.287 に答える