¿Hay alguna razón justificable para usar new y un constructor en una clase de números en Java?

StackOverflow https://stackoverflow.com/questions/1009087

  •  06-07-2019
  •  | 
  •  

Pregunta

¿Hay alguna razón justificable para que en Java algo así como

Long l = new Long(SOME_CONSTANT)

Esto crea un objeto adicional y está etiquetado por FindBugs, y obviamente es una mala práctica. Mi pregunta es si alguna vez hay una buena razón para hacerlo.

Anteriormente le pregunté acerca de los constructores de cadenas y obtuve una buena respuesta , pero esa respuesta no parece aplicarse a los números.

¿Fue útil?

Solución

Solo si desea asegurarse de obtener una instancia única, entonces prácticamente nunca.

Algunos números se pueden almacenar en caché cuando se guardan automáticamente en la caja (aunque Longs no se garantiza que sean ), lo que puede causar problemas. Pero cualquier código que se rompa debido al almacenamiento en caché probablemente tenga problemas más profundos. En este momento, no puedo pensar en un solo caso válido para ello.

Otros consejos

  

Mi pregunta es si alguna vez hay una buena razón para hacerlo.

Aún puede usarlo si desea escribir código compatible con JRE anteriores. valueOf (largo) solo se introdujo en Java 1.5, por lo que en Java 1.4 y antes de que el constructor fuera la única forma de pasar directamente de un largo a un Largo . Espero que no esté en desuso porque el constructor todavía se usa internamente.

Lo único que se me ocurre es hacer que el boxeo sea explícito, aunque el código autoboxing equivalente se compila en Long.valueOf (SOME_CONSTANT) que puede almacenar en caché pequeños valores: (de jvm src)

   public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
        return new Long(l);
  }

. No es un gran problema, pero no me gusta ver código que continuamente encajona y desempaqueta sin tener en cuenta el tipo, que puede volverse descuidado.

Funcionalmente, sin embargo, no puedo ver la diferencia de una forma u otra. El nuevo largo todavía se calculará como iguales y el código hash es igual al autoboxed, por lo que no puedo ver cómo podría incluso hacer una distinción funcional si quisiera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top