setscale round multiply decimals java bigdecimal

java - round - BigDecimal.ZERO vs. nuevo BigDecimal(0). ¿Cuál usar y por qué?



java bigdecimal sum (2)

Me preguntaba si estos dos son los mismos. ¿Alguien puede verificar? (Estoy tratando de reemplazar el primero con el segundo)

BigDecimal totalCurrentSales = new BigDecimal(0);

y

BigDecimal totalCurrentSales = BigDecimal.ZERO;

La razón por la que pregunto es que no es correcto declararlo de la primera manera ya que no se supone que cree instancias de BigInteger y BigDecimal (ZERO, ONE, TEN) ya existentes BigDecimal (ZERO, ONE, TEN) . Así que me preguntaba si podría decirlo de la segunda forma y aún podría considerarse crear una instancia. En lugar de tener que crear una variable zero o algo que sea igual a BigDecimal.ZERO . ¿O hay alguna otra manera?

Lo intenté

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);

Pero el eclipse no fue muy feliz.


BigDecimal no tiene un constructor que tome un BigDecimal como argumento, por lo que explica por qué Eclipse no estaría contento con eso.

BigDecimal es inmutable, lo que significa que una vez que creas un objeto, su estado nunca cambia.

Además, los métodos igual y hashcode de BigDecimal se anulan para ir por valor, a diferencia de la implementación predeterminada de Object, que compara las referencias. Así que no hay diferencia entre BigDecimal.ZERO y el nuevo BigDecimal ("0") desde el punto de vista de cómo se usan, excepto que crear una nueva instancia es más trabajo para la JVM (y generará más basura cuando no la use). Ya no necesito ese objeto).

El hecho de que BigDecimal sea inmutable y esté basado en valores significa que la referencia específica que se use no importará al código que use BigDecimal.

Debido a que BigDecimal.ZERO ya está creado para usted y las comparaciones entre BigDecimals son por valor, tiene sentido minimizar la cantidad de valores que usa para que sus programas creen menos basura. Es por eso que te animas a usar BigDecimal.ZERO.


Matemáticamente, son lo mismo. Además, como los BigDecimals son inmutables, no tiene que preocuparse por crear nuevas instancias para hacer nuevos cálculos. Tan pronto como realice alguna operación en su instancia de totalCurrentSales , en realidad estará creando un nuevo BigDecimal y reasignando la referencia totalCurrentSales al nuevo valor.

Desde una perspectiva de instanciación, no son necesariamente exactamente lo mismo. En la implementación de OpenJDK 6b14, por ejemplo, BigDecimal.ZERO se crea invocando al new BigDecimal(BigInteger, long, int) privado new BigDecimal(BigInteger, long, int) con los valores BigInteger.ZERO , 0 y 0 .

Desde la perspectiva de la calidad del código, es preferible utilizar BigDecimal.ZERO al new BigDecimal(0) ya que evita la new BigDecimal(0) instancias adicionales y tiene un literal en su código.