43

オブジェクトに関するデバッグ情報が必要な場合は、toString の暗黙的な呼び出しを使用していました。これは、オブジェクトが null の場合は例外をスローしないためです。

例えば:

System.out.println("obj: "+obj);

それ以外の:

System.out.println("obj: "+obj.toString());

nullの場合以外に違いはありますか?
前者が機能しない場合、後者のケースは機能しますか?

編集:
暗黙の呼び出しの場合、正確には何が行われますか?

4

5 に答える 5

59

違いはほとんどありません。より短く、より頻繁に機能するものを使用してください。

他の理由で実際にオブジェクトの文字列値を取得する必要があり、null フレンドリーにしたい場合は、次のようにします。

String s = String.valueOf(obj);

編集:質問が拡張されたので、回答を拡張します。

どちらの場合も、コンパイルすると次のようになります。

System.out.println(new StringBuilder().append("obj: ").append(obj).toString());

yourtoString()が暗黙的である場合、2 番目の追加でそれがわかります。

Java のソース コードを見ると、StringBuilder.append(Object)次のようになっていることがわかります。

public StringBuilder append(Object obj) {
    return append(String.valueOf(obj));
}

次のようになりString.valueOfます。

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

ここで、あなたtoString()自身の場合は、null チェックとスタック フレームをバイパスして、次の手順に直行しますStringBuilder

public StringBuilder append(String str) {
    super.append(str);
    return this;
}

そのため...両方のケースで非常によく似たことが起こります。1つはもう少し仕事をするだけです。

于 2008-11-30T09:26:18.443 に答える
3

他の人が言ったように -"" + objメソッドを使用してください。

Java言語仕様によると:

  • 用語が null の場合は、"null"
  • プリミティブ型は、ボックス型コンストラクターnew Boolean(X)などを使用して変換されます
  • toString()呼び出されます (または同等の)
  • 結果が のtoString()場合null、使用"null"
  • 文字列を連結します。
于 2008-11-30T09:41:28.383 に答える
1

実際、不変条件でオブジェクトが null であってはならないと言われていても、それは問題ではありません。したがって、obj を null として受け入れるかどうかによって異なります。

于 2008-11-30T11:04:08.107 に答える
1

あなたが言うように、ヌルの安全性を除いて違いはありません。常に後者よりも前者を優先します。

于 2008-11-30T09:25:53.233 に答える