Есть ли разница между BigDecimal ("0") и BigDecimal.ZERO? - PullRequest
26 голосов
/ 06 ноября 2008

Либо для сравнения, либо для инициализации новой переменной, имеет ли значение, какую из них вы используете?

Я знаю, что BigDecimal.ZERO - это функция 1.5, так что это проблема, но если я использую 1.5, имеет ли это значение?

Спасибо.

Ответы [ 4 ]

36 голосов
/ 06 ноября 2008

BigDecimal.ZERO - это предопределенная константа, поэтому ее не нужно оценивать по строке во время выполнения, как было бы BigDecimal("0"). Это будет быстрее и не потребует создания нового объекта.

Если ваш код должен быть запущен до версии 1.5, вы можете использовать шаблон (с большим количеством клеветы) Singleton для создания объекта, эквивалентного BigDecimal.ZERO. При первом использовании он вызывает BigDecimal("0") для создания нулевого объекта и возвращает этот объект при последующих вызовах. В противном случае, если ваш код работает в системе 1.5, ваш одноэлементный объект может просто вернуть BigDecimal.ZERO без штрафа за время выполнения.

14 голосов
/ 06 ноября 2008

Использование ZERO не создает новый объект и не требует анализа. Определенно путь.

4 голосов
/ 13 марта 2009

Прежде чем говорить о штрафах за время выполнения, убедитесь, что этот фрагмент кода имеет значение. Настройте профилирование и измерьте полный вариант использования.

Тем не менее, предпочитайте Bigdecimal.ZERO, так как он проверяется во время компиляции, тогда как вы можете случайно набрать new BigDecimal("9"), который будет принимать компилятор, но который вызовет ошибки в вашем приложении.

3 голосов
/ 06 ноября 2008

Из любопытства я проверил конструктор для BigDecimal, и он не имеет никаких оптимизаций для строки "0". Так что определенно да, есть разница.

...