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




BigDecimal.ZERO - это предопределенная константа, поэтому ее не нужно вычислять из строки во время выполнения, как это было бы для BigDecimal("0"). Это будет быстрее и не потребует создания нового объекта.
Если ваш код должен работать в версиях, предшествующих 1.5, вы можете использовать (очень злонамеренно) шаблон Singleton для создания объекта, эквивалентного BigDecimal.ZERO. При первом использовании он вызывает BigDecimal("0") для создания нулевого объекта и возвращает этот объект при последующих вызовах. В противном случае, если ваш код работает в системе 1.5, ваш одноэлементный объект может просто вернуть BigDecimal.ZERO без штрафа во время выполнения.
Нет необходимости создавать синглтон, если вы просто создаете общедоступный статический final в классе final, вызываемом по строкам «Константы», и просто используете его.
@Spencer, это то же самое
Использование ZERO не создает новый объект и не требует какого-либо анализа. Определенно лучший способ.
Из любопытства я проверил конструктор для BigDecimal, и он не имеет никаких оптимизаций для строки «0». Так что определенно да, разница есть.
В любом случае разница будет, так как вызов new BigDecimal («0») будет каждый раз создавать новый объект.
С этим не поспоришь. Мне просто было любопытно узнать, насколько большим будет штраф без использования ZERO. Оказывается, это существенно, поскольку конструктор BigDecimal довольно тяжелый.
Прежде чем говорить о штрафах во время выполнения, убедитесь, что этот фрагмент кода имеет значение. Настройте профилирование и оцените полный вариант использования.
Тем не менее, предпочтите Bigdecimal.ZERO, поскольку он проверяется во время компиляции, тогда как вы можете случайно набрать new BigDecimal("9"), что компилятор примет, но вызовет ошибки в вашем приложении.
Это можно сказать о любом количестве.
@RobertL: Да, но это устраняет это для одного из чисел, уменьшая указанный риск на 1/10 :). Также нет шансов выкинуть NumberFormatException.
new BigDecimal («0») каждый раз создает новый экземпляр объекта, но BigDecimal.ZERO не создает новые экземпляры.