2008-11-06 3 views

답변

35

BigDecimal.ZERO은 미리 정의 된 상수이므로 런타임시 문자열에서 평가할 필요가 없습니다 (BigDecimal("0")). 더 빨라지고 새로운 객체를 만들 필요가 없습니다.

코드가 1.5 이전 버전에서 실행되어야하는 경우, (많은 점수를 매긴) 싱글 톤 패턴을 사용하여 BigDecimal.ZERO과 같은 객체를 만들 수 있습니다. 처음 사용될 때 BigDecimal("0")을 호출하여 0 개체를 만들고 이후 호출시 해당 개체를 반환합니다. 그렇지 않으면 코드가 1.5 시스템에서 실행되는 경우, 싱글 톤 객체는 런타임 페널티없이 BigDecimal.ZERO을 반환 할 수 있습니다.

+0

나는 "본질적으로"라는 단어를 제거 할 것입니다. 이것은 미리 정의 된 상수입니다. –

+0

전화를 잘 주셔서 감사합니다. –

+1

new BigDecimal ("0")은 매번 새로운 객체 인스턴스를 생성하지만 BigDecimal.ZERO는 새 인스턴스를 생성하지 않습니다. –

13

ZERO를 사용하면 새 개체가 생성되거나 구문 분석이 필요하지 않습니다. 확실히가는 길.

3

호기심에서 벗어났습니다. BigDecimal 용 생성자를 검사했으며 "0"문자열에 대한 최적화가 없습니다. 확실히 그렇습니다. 차이점이 있습니다.

+3

어쨌든 new BigDecimal ("0")을 호출 할 때마다 새로운 객체가 생성되므로 차이가 있습니다. –

+0

주장 할 수 없습니다. 나는 단지 ZERO를 사용하지 않는 것이 얼마나 큰 벌칙인지를 알고 싶어했다. BigDecimal의 생성자가 꽤 무거워서 상당한 양입니다. –

4

런타임 처벌에 대해 이야기하기 전에이 코드가 중요한지 확인하십시오. 프로파일 링을 설정하고 완전한 유스 케이스를 측정하십시오.

그럼에도 불구하고 컴파일시에 확인하면 Bigdecimal.ZERO을 선호하지만 실수로 컴파일러에서 허용하는 new BigDecimal("9")을 입력 할 수 있지만 응용 프로그램에 버그가 발생할 수 있습니다.

+0

숫자에 관계없이 이것을 말할 수 있습니다. –

+1

@RobertL : 그렇습니다. 그러나 이것은 숫자 중 하나에 대해이를 제거하여 상기 위험을 1/10로 줄입니다. :) 'NumberFormatException'을 던질 기회도 없습니다. – wchargin