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.