質問
オブジェクトのデバッグ情報が必要な場合、オブジェクトがnullの場合は例外をスローしないため、toStringの暗黙的な呼び出しを使用していました。
たとえば:
System.out.println("obj: "+obj);
代わりに:
System.out.println("obj: "+obj.toString());
nullケース以外に違いはありますか?
前者が機能しない場合、後者のケースは機能しますか?
編集:
暗黙的な呼び出しの場合、正確に何が行われますか?
解決
ほとんど違いはありません。より短く、より頻繁に動作するものを使用してください。
他の理由でオブジェクトの文字列値を実際に取得し、nullフレンドリーにしたい場合は、次のようにします。
String s = String.valueOf(obj);
編集:質問が延長されたため、回答を延長します。
どちらの場合も、次のようにコンパイルされます:
System.out.println(new StringBuilder().append("obj: ").append(obj).toString());
toString()
が暗黙的である場合、2回目の追記でそれを確認できます。
javaのソースコードを見ると、 StringBuilder.append(Object)
は次のようになっていることがわかります。
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
where 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;
}
つまり、どちらの場合も非常に似たようなことが起こります。もう少し作業を行うだけです。
他のヒント
他の人が言ったように-"" + obj
メソッド。
- 用語がnullの場合、
" null"
を使用します
- プリミティブ型は、boxed-typeコンストラクター
new Boolean(X)
または任意のものを使用して変換されます -
toString()
が呼び出されます(または同等のもの) - tocode()の result が
null
の場合、" null"
を使用します
- 文字列を連結します。
あなたが言うように、ヌルの安全性を除いて違いはありません。常に前者を後者より好む。
実際には、オブジェクトがnullであってはならないという不変式があれば、それは問題ではありません。そのため、objをnullとして受け入れるかどうかによって異なります。
一般的な参照型を記述するのは非常に簡単です。
class ref
{
static public class Reference<T>
{
private T value;
public Reference(T value) { set(value); }
public Reference() { set(null); }
public void set (T value) { this.value = value; }
public T get () { return this.value; }
public String toString() { return String.valueOf(this.value); }
}
static void fillString (Reference<String> str)
{
str.set("foo");
}
public static void main (String[] args)
{
Reference<String> str = new Reference<String>("");
fillString(str);
System.out.println (str);
}
}
実行すると、必要な出力が得られます。
javac ref.java && java ref
foo