11

私の教授はかつて、次のコードは決して実行すべきではないと言いました。

System.out.println(object.toString());

彼は言った(そして私は「効果的なJava」を引用したと思う)それは二重呼び出しを引き起こす. print ステートメントはオブジェクトの toString メソッドを呼び出すため、 toString メソッドを 2 回呼び出すと効率が低下します。推奨される方法は、次を使用することです。

System.out.println(オブジェクト);

明らかに、この方法はコードで見栄えがよく、時間を節約できます。私はいつもこのようにしていますが、私の質問は「これは実際により効率的ですか?」です。PrintStreamのドキュメントを見ると、print メソッドがオーバーロードされて、パラメーターとして String を受け取るようになっています (これは、toString メソッドが最初に呼び出された場合に当てはまります)。そのバージョンの print メソッドが入力されたパラメーターの toString メソッドを呼び出す場所がわかりません。それを行う意味があるとは思いません。

また、重複していたらすみません。それに関するトピックは見つかりませんでした。

4

3 に答える 3

9

あなたの例は、PrintStream で 2 つの異なるメソッドを呼び出します。toString()どちらも最大 1 回呼び出します。

  • 最初のメソッドはprintln(String x)を呼び出しますが、これは x.toString() 自体を呼び出しません
  • 2 番目のメソッドはprintln( Object x )を呼び出します。これにより、x が null でない場合は x.toString() が呼び出されます。

ただし、 を使用することには潜在的な利点がありSystem.out.println(object)ます。オブジェクトが null の場合、これは "null" を出力します。もう 1 つのステートメントは、NullPointerException をスローします。

于 2013-05-15T17:08:40.683 に答える
6

いいえ、それはより効率的ではありません-あなたが言及した過負荷のためです。toStringさらに、 on aの呼び出しStringは非常に高速であるため、過負荷がなくても違いは測定できません。

ただし、あなたの教授は のようSystem.out.println(object.toString());に呼び出しを行わないことについては正しいですが、理由は異なります。呼び出しが不要なため、コードの読者が混乱する可能性があります。

于 2013-05-15T17:01:59.663 に答える
0

マルチスレッド環境で System.out.println を呼び出すことは実際には十分に悪いことであり、toString への不要な呼び出しよりもはるかに悪いことですらあります。「println」内に同期呼び出しがあるため、「問題」が存在します。

public void println() {
newLine();
}

private void newLine() {
try {
    synchronized (this) {
    ensureOpen();
...
}

したがって、効率的な Java を作成しようとしている場合は、それを回避することから始めることができます。別の方法として、http: //www.slf4j.org/などの別のロギング メカニズムを使用することもできます。

于 2013-05-15T17:55:13.103 に答える