BigDecimal.ZERO против нового BigDecimal (0). Что использовать и почему?

Мне было интересно, совпадают ли эти два. Может ли кто-нибудь проверить? (Я пытаюсь заменить 1-й на 2-й)

BigDecimal totalCurrentSales = new BigDecimal(0);

и

BigDecimal totalCurrentSales = BigDecimal.ZERO;

Причина, по которой я спрашиваю, заключается в том, что это не так, чтобы объявить ее первым способом, поскольку вы не должны создавать экземпляры уже существующих BigInteger и BigDecimal (ZERO, ONE, TEN). Поэтому мне было интересно, могу ли я сказать это вторым способом, и это все равно считается созданием экземпляра. Вместо меня нужно создать переменную zero или что-то, что равно BigDecimal.ZERO. Или есть другие способы?

Я пробовал

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);

но затмение было не слишком счастливым.

Ответы

Ответ 1

Математически, они одинаковы. Кроме того, поскольку BigDecimals неизменяемы, вам не нужно беспокоиться о создании новых экземпляров для выполнения новых вычислений. Как только вы выполните некоторую операцию на вашем экземпляре totalCurrentSales, вы фактически создадите новый BigDecimal и переназначаете ссылку totalCurrentSales на новое значение.

С точки зрения реализации, они не обязательно точно такие же. В реализации OpenJDK 6b14, например, BigDecimal.ZERO создается путем вызова частного конструктора new BigDecimal(BigInteger, long, int) со значениями BigInteger.ZERO, 0 и 0.

С точки зрения качества кода использование BigDecimal.ZERO предпочтительнее new BigDecimal(0), поскольку вы избегаете дополнительной инстанцирования и имеете литерал в своем коде.

Ответ 2

BigDecimal не имеет конструктора, который принимает BigDecimal в качестве аргумента, поэтому это объясняет, почему Eclipse не был бы этому доволен.

BigDecimal является неизменным, что означает, что после создания объекта его состояние никогда не изменяется.

Также методы BigDecimal equals и hashcode переопределяются, чтобы идти по значению, в отличие от реализации по умолчанию Object, которая сравнивает ссылки. Таким образом, нет никакой разницы между BigDecimal.ZERO и новым BigDecimal ( "0" ) с точки зрения того, как они используются, за исключением того, что создание нового экземпляра - это больше работы для JVM (и будет генерировать больше мусора, t нужен этот объект больше).

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

Поскольку BigDecimal.ZERO уже создан для вас, а сравнения между BigDecimals по значению, имеет смысл минимизировать количество используемых вами значений, чтобы ваши программы создавали меньше мусора. Вот почему вас поощряют использовать BigDecimal.ZERO.