(Para los fines de esta pregunta, supongamos que uno intencionalmente no usa el auto (un) boxing, ya sea porque uno está escribiendo código pre-Java 1.5, o porque uno siente que el autoenvío hace que sea muy fácil crear NullPointerException
s .)¿Por qué querría uno usar los constructores públicos en Boolean y clases inmutables similares?
Tome Boolean
, por ejemplo. La documentación para el constructor Boolean(boolean)
dice:
Nota: Rara vez es apropiado utilizar este constructor. A menos que se requiera una nueva instancia , la fábrica estática
valueOf(boolean)
generalmente es una mejor opción. Es probable que rinda significativamente mejor espacio y tiempo rendimiento.
Mi pregunta es, ¿por qué cada vez desee obtener una nueva instancia en el primer lugar? Parece que las cosas serían más simples si los constructores como ese fueran privados. Por ejemplo, si lo fueran, podría escribir esto sin peligro (incluso si eran myBoolean
null
):
if (myBoolean == Boolean.TRUE)
que sería seguro porque toda verdadera Booleans
habría referencias a Boolean.TRUE
y todas falsas Booleans
habría referencias a Boolean.FALSE
. Pero debido a que los constructores son públicos, alguien puede haber usado ellos, lo que significa que usted tiene que escribir esto en su lugar:
if (Boolean.TRUE.equals(myBoolean))
Pero donde realmente se pone malo es cuando se desea comprobar dos Booleans
por la igualdad. Algo como esto:
if (myBooleanA == myBooleanB)
... se convierte en esto:
if (
myBooleanA == myBooleanB ||
(myBooleanA != null && myBooleanA.equals(myBooleanB))
)
ACTUALIZACIÓN: Con el lanzamiento de Java 7, java.util.Objects hace que este más simple posible construir:
if (Objects.equals(myBooleanA, myBooleanB))
No puedo pensar en ninguna razón para tener instancias separadas de estos objetos, que es más convincente que no tener que hacer las tonterías anteriores. ¿Lo que usted dice?
Tiene el último bloque de código erróneo. O bien 'a == nulo? b == nulo: a.equals (b) 'o' a == b || (a! = null && a.equals (b)) '. O 'Objects.eq (a, b)'. –
Tiene razón. Lo cambié a 'a == b || (a! = null && a.equals (b)) '. –