Pregunta

¿Hay alguna razón para utilizar Integer.valueOf (X) para inicializar un entero final, como a continuación:

public class MyClass
{
  public static final Integer DAY_1 = Integer.valueOf(1); // Why do it this way?
  public static final Integer DAY_2 = 2; // When it can be done this way?
}

Yo entiendo que esto era necesario en las versiones antiguas de Java antes de añadir autoboxing. ¿Hay alguna razón para este tipo de código permanecen? ¿O es sólo un mal hábito?

¿Fue útil?

Solución

  • Hay una gran cantidad de código escrito antes de 1.5 salió. No hay necesidad de actualizar todo sin traer ningún beneficio.
  • En algunos casos, hace que sea más claro que son boxeo. En el caso que dio usted puede ver fácilmente el tipo de destino en la misma línea - pero eso no es siempre el caso
  • .
  • Si desea llamar a un método que tiene las sobrecargas, tanto para Integer y int y desea llamar a la sobrecarga de Integer, esta es una manera fácil de hacerlo.

Otros consejos

Un programador puede optar por escribir de esta manera con el fin de resaltar visualmente que DAY_1 es un entero (objeto), no un int.

No estoy diciendo que lo recomiendo, pero podía imaginar que alguien tome este enfoque por esa razón.

No Además de las razones de Jon, algunas personas simplemente les gusta automático de (des) el boxeo, y punto. Hay muchos matices a lo que algunas personas optan por evitar categóricamente por la prohibición de su uso en general a través de errores de compilación opcionales o advertencias (Eclipse puede convertirlos en errores o advertencias, por ejemplo.)

Si ese es el caso, no hay mucho donde elegir, además de utilizar la primera, incluso en casos como este, donde en realidad no está ganando mucho.

En lo que se refiere al compilador, no hay diferencia (aunque uno debe utilizar el cuidado en el caso de los argumentos sobrecargados). Bajo el capó, la forma mostrada para DAY_2 simplemente se convierte en la forma utilizada para DAY_1 por el compilador.

Para los seres humanos, puede haber una diferencia. Me suelen evitar automático boxeo (ONU) como un acto de programación defensiva, porque siento que la práctica hace que sea muy fácil para mí olvidar el caso nulo. Pero, en realidad, le toca a usted.

Autoboxing puede conducir a errores muy sutiles que pueden ser muy difíciles de encontrar. Debido a esto, algunos IDE tienen capacidad de generar una advertencia cuando se utiliza cualquier tipo de boxeo / unboxing. Si desea silenciar esta opción advertencias 1 lo hará por usted.

Así que, al final, todo se reduce a preferencias personales y las normas de codificación de los proyectos.

En este caso particular, no hay peligro para el uso de autoboxing.

Integer.valueOf (1) permite el almacenamiento en caché de valores comunes; para los valores de -128 a 128, siempre devolverá el mismo objeto, por ejemplo, mientras que new Integer (1) siempre devolverá un nuevo objeto. Yo diría que es una buena práctica usar esto para todos los tipos deriva Número (entero, largas, BigDecimal, etc.), aunque esto es probablemente lo que está haciendo autoboxing bajo las sábanas de todos modos.

Bart van Heukelom, la diferencia entre list.remove (1) y list.remove (new Integer (1)) es de este; list.remove (1) se eliminará el objeto en el índice 1 de la lista, list.remove (new Integer (1)) eliminará todos los objetos en la lista que son iguales al objeto entero con un valor de uno. Recuerde que las colecciones no pueden almacenar primitivas, sólo los objetos.

Es un mal hábito y no hay razón para hacerlo ya que la compilación generará el Integer.valueOf() para usted.

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