2013-05-15 3 views
11

는 내 교수는 한 번 다음과 같은 코드가 수행해서는 안됩니다 말했다 :System.out.println() 내에서 toString() 메서드를 두 번 호출 하시겠습니까?

에서 System.out.println을 Object.toString (());

그가 말했듯이 (나는 "효과적 Java"라고 언급했다) 그는 이중 호출을 야기한다고 말했다. print 문은 객체의 toString 메서드를 호출하기 때문에 toString 메서드를 두 번 호출하는 것이 덜 효율적입니다. 선호되는 방법은 다음을 사용하는 것입니다 :

System.out.println (object);

분명히이 방법은 코드가 좋아 보이며 시간을 절약 할 수 있습니다. 내가 상관없이이 일을 항상 하겠지만, 나의 질문은 "이것이 실제로 더 효과적입니까?"입니다. PrintStream 문서를 살펴보면 print 메소드가 오버로드되어 String을 매개 변수로 사용합니다 (toString 메서드가 먼저 호출 된 경우). print 메소드의 해당 버전이 입력 된 매개 변수의 toString 메소드를 호출하는 곳을 보지 못하고 있으며이를 수행하는 것이 타당하지 않을 것이라고 생각합니다.

또한이 사본이 중복 된 경우 죄송합니다. 내가 그것에 대한 주제를 찾을 수 없습니다.

+1

+1 좋은 질문입니다. 좋은 연구. – iamnotmaynard

+0

더 중요한 것은,'println'에 대한 호출은'toString'에 대한 호출보다 훨씬 더 많은 시간이 걸리므로 이것은 거의 부적절한 것입니다. – assylias

답변

6

아니요, 더 효율적이지 않습니다. 정확하게 언급 한 과부하 때문입니다. 또한 String에있는 toString의 전화는 매우 빠르므로 과부하가 없어도 차이를 측정 할 수 없습니다.

그러나 교수님은 System.out.println(object.toString());과 같은 전화를하지 않는 것이 옳았지만 그 이유는 다릅니다. 전화가 불필요하기 때문에 코드 독자가 혼란 스러울 수 있습니다.

9

예에서는 PrintStream에서 두 가지 다른 메서드를 호출합니다. 둘 다 toString() 번만 호출합니다.

  • 첫 번째 방법은 x.toString()를 자체 호출하지 않는 , println(String x)를 호출합니다.
  • 두 번째 메서드는 println(Object x)을 호출하며 x가 null이 아니면 x.toString()을 호출합니다.

그러나 System.out.println(object)을 사용하면 잠재적 인 이점이 있습니다. 개체가 인 경우 null이며이 값은 "null"입니다. 다른 명령.은 NullPointerException을 _ 생시킵니다.

0

멀티 스레딩 환경에서 System.out.println을 호출하면 실제로 불충분하며 심지어 toString에 대한 불필요한 호출보다 최악입니다. 당신이 "에 println"내부 synchorized 전화를 가지고 있기 때문에 "문제는"존재 : 당신이 효율적으로 자바를 작성하려는 경우

public void println() { 
newLine(); 
} 

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

그래서, 당신이 그것을 피함으로써 시작할 수 있습니다. 다른 로깅 메커니즘 중 하나를 사용할 수도 있습니다. http://www.slf4j.org/

관련 문제