質問

オブジェクトのデバッグ情報が必要な場合、オブジェクトが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 メソッド。

Java言語仕様

  • 用語が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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top