Есть ли разница между BigDecimal («0») и BigDecimal.ZERO?

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

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

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
26
0
53 537
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

new BigDecimal («0») каждый раз создает новый экземпляр объекта, но BigDecimal.ZERO не создает новые экземпляры.

Juha Syrjälä 06.11.2008 22:35

Нет необходимости создавать синглтон, если вы просто создаете общедоступный статический final в классе final, вызываемом по строкам «Константы», и просто используете его.

Spencer Kormos 06.11.2008 23:25

@Spencer, это то же самое

wds 13.03.2009 18:09

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

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

В любом случае разница будет, так как вызов new BigDecimal («0») будет каждый раз создавать новый объект.

Jon Skeet 06.11.2008 22:30

С этим не поспоришь. Мне просто было любопытно узнать, насколько большим будет штраф без использования ZERO. Оказывается, это существенно, поскольку конструктор BigDecimal довольно тяжелый.

Allain Lalonde 07.11.2008 19:08

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

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

Это можно сказать о любом количестве.

Robert L 05.09.2009 08:41

@RobertL: Да, но это устраняет это для одного из чисел, уменьшая указанный риск на 1/10 :). Также нет шансов выкинуть NumberFormatException.

wchargin 25.09.2011 10:27

Другие вопросы по теме