2013-05-15 6 views
11

鉱山の教授は、かつて次のコードが実行すべきではないことを言った:System.out.println()内のtoString()メソッドはダブルコールですか?

のSystem.out.println(Object.ToStringを());

彼(私は "効果的なJava"を引用したと信じて)それはダブルコールを引き起こすと述べた。 print文はオブジェクトのtoStringメソッドを呼び出すため、toStringメソッドを2回呼び出す方が効率的ではありません。好ましい方法は、単に使用することです:

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

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

また、重複している場合はごめんなさい。私はそれに関する話題を見つけることができませんでした。

+1

+1いい質問です。良い研究。 – iamnotmaynard

+0

さらに重要なことに、 'println'の呼び出しは' toString'の呼び出しよりもはるかに時間がかかり、これはほとんど無関係です。 – assylias

答えて

6

いいえ、これは効率的ではありません。正確に言及した過負荷のためです。さらに、StringtoStringのコールは非常に高速です。したがって、過負荷がなくても、その差は測定できません。

しかし、あなたの教授はSystem.out.println(object.toString());のような呼び出しをしないのが正しいですが、理由は異なります。呼び出しが不要なため、コードの読者は混乱するかもしれません。

9

例では、PrintStreamで2つの異なるメソッドを呼び出しています。両方ともtoString()を呼び出します。

  • 第一の方法は、が x.toString()自体を呼び出さない、println(String x)を呼び出します。
  • 2番目のメソッドはprintln(Object x)を呼び出し、xがnullでない場合は x.toString()を呼び出します。

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

0

マルチスレッド環境では、System.out.printlnを呼び出すことは実際には不十分で、不必要なtoStringの呼び出しよりもはるかに最悪です。あなたは「printlnの」内部synchorized電話を持っているので、「問題」が存在:あなたは、効率的なJavaの書き込みしようとしている場合

public void println() { 
newLine(); 
} 

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

そう、あなたはそれを避けることによって開始することができます。代わりに、さまざまなロギングメカニズムのいずれかを使用することができます。 http://www.slf4j.org/

関連する問題