2008-11-06 8 views

Respuesta

35

BigDecimal.ZERO es una constante predefinida y, por lo tanto, no tiene que evaluarse desde una cadena en tiempo de ejecución como BigDecimal("0"). Será más rápido y no requerirá la creación de un nuevo objeto.

Si su código necesita ejecutarse en pre-1.5, entonces puede usar el patrón Singleton (muy difamado) para crear un objeto equivalente a BigDecimal.ZERO. La primera vez que se use, llamaría al BigDecimal("0") para crear un objeto cero y devolver ese objeto en llamadas posteriores. De lo contrario, si su código se ejecuta en un sistema 1.5, su objeto singleton puede simplemente devolver BigDecimal.ZERO sin penalización de tiempo de ejecución.

+0

Quitaría la palabra "esencialmente" - ES una constante predefinida. –

+0

Buena llamada, gracias. –

+1

new BigDecimal ("0") crea una nueva instancia de objeto cada vez, pero BigDecimal.ZERO no crea nuevas instancias. –

13

El uso de ZERO no crea un objeto nuevo ni requiere ningún análisis. Definitivamente es el camino a seguir.

3

Por curiosidad revisé al constructor para BigDecimal y no tiene ninguna optimización para la cadena "0". Definitivamente sí, hay una diferencia.

+3

De todos modos, habría una diferencia, ya que al llamar al nuevo BigDecimal ("0") se creará un nuevo objeto cada vez. –

+0

No puedo discutir eso. Solo tenía curiosidad por saber qué tan grande sería una penalización sin usar ZERO. Resulta que es sustancial ya que el constructor de BigDecimal es bastante pesado. –

4

Antes de hablar sobre las penalizaciones de tiempo de ejecución, asegúrese de que este código sea importante. Configure los perfiles y mida el caso de uso completo.

Sin embargo, prefiera Bigdecimal.ZERO, ya que se comprueba en tiempo de compilación, mientras que puede accidentalmente escribir new BigDecimal("9"), que el compilador aceptará, pero que causará errores en su aplicación.

+0

Puede decir esto sobre cualquier número. –

+1

@RobertL: Sí, pero esto elimina esto para uno de los números, reduciendo dicho riesgo en 1/10 :). Tampoco tiene ninguna posibilidad de arrojar 'NumberFormatException'. – wchargin

Cuestiones relacionadas