2010-02-12 17 views
32

Resumen prácticamente lo dice todo. He aquí el fragmento correspondiente de código en ImmutableList.createFromIterable():¿Por qué ImmutableList.of() y sus amigos prohíben elementos nulos?

if (element == null) { 
    throw new NullPointerException("at index " + index); 
    } 

me he encontrado esto varias veces y no puedo ver por qué una función de biblioteca de propósito general debe imponer esta limitación.

Editar 1: por "propósito general", estaría contento con el 95% de los casos. Pero no creo haber escrito 100 llamadas al ImmutableList.of() todavía, y he sido mordido por esto más de una vez. Aunque tal vez sea un caso atípico. :)

Editar 2: supongo que mi gran queja es que esto crea un "hipo" cuando se interactúa con las colecciones estándar java.util. Como señaló en su charla, los problemas con null s en las colecciones pueden aparecer muy lejos de donde se insertaron esos nulos. Pero si tengo una larga cadena de código que pone valores nulos en una colección estándar en un extremo y los maneja correctamente en el otro, entonces no puedo sustituir una clase de colecciones de google en ningún momento, porque inmediatamente lanza un NullPointerException.

+1

Pregunta: ¿interpretas que "propósito general" significa "100% de los propósitos" o "95% de los propósitos"? –

+0

responde en línea –

+1

Re: edición 2: Esto es para afirmar que todos los puntos intermedios en el camino deben ser independientes de si pasan nulos a través o no. ¡No estoy de acuerdo con esto! Cada una de estas API debería permitir explícitamente nulo o explícitamente no permitirlo. Todo el mundo puede continuar presionando este punto todo lo que quiera, pero tenga en cuenta que es pura queja y nada constructivo. Incluso si nos convencieras a todos de que estábamos equivocados, equivocados, equivocados (improbables, por supuesto), aún no importaría: de todos modos, no podemos cambiarlo. –

Respuesta

34

he explicado en el punto 25 minutos de este video: http://www.youtube.com/watch?v=ZeO_J2OcHYM

Lo siento por la respuesta perezosa, pero esto es después de todo, sólo un "por qué" (podría decirse que no es apropiado para Stackoverflow?).

EDIT: Aquí hay otro punto que no estoy seguro de haber aclarado en el video: el total (en todo el código Java), cantidad de código adicional que se debe escribir para esos casos nulos utilizar el viejo standby Collections.unmodifiableList(Arrays.asList(...)) etc. se ve abrumado por la cantidad total (a través de todo el código Java) de llamadas adicionales checkArgument(!foos.contains(null)) que todos deberían agregar si nuestras colecciones no se ocuparon de eso para usted. La mayoría, por FAR, los usos de una colección no esperan ningún nulo, y realmente deberían fallar rápidamente si es que hay alguno.

+0

Supongo que mi historial de preguntas sobre las colecciones de google en SO no es tan caluroso. : -/ –

+9

-1. No me diga qué debería o no debería poner en mis colecciones. Los nulos suelen ser válidos en mis listas. Es raro que quiera nulos en un conjunto o mapa, pero hay muchas otras herramientas que puedo usar si quiero protegerme contra elementos nulos. – finnw

+24

Primero, ¿quién te dice que no pongas null en una colección? Si es necesario, como necesitamos los Googlers el 5% de las veces (lo estudiamos detenidamente), solo use una colección que lo admita. En segundo lugar, se hizo una elección, y esta pregunta pregunta por qué se hizo la elección. ¿Realmente tiene sentido rechazar la respuesta porque no te gusta la elección? Sigue siendo la respuesta a la pregunta. –

0

Una razón es que permite que las funciones que funcionan en la lista no tengan que verificar cada elemento para nulo, mejorando significativamente el rendimiento.

+4

No, las mejoras de rendimiento que obtuvimos de esto fueron MUY pequeñas en el gran esquema de cosas. –

+0

Excepto que Function anota su parámetro como @Nullable, por lo que en realidad tendrá que verificar que null satisfaga la inspección del código, a pesar de que la lista no puede contener nulos. (lol) – Trejkaz

5

En general, en Google Collections los desarrolladores pertenecen al grupo que no cree que los valores nulos sean un parámetro de propósito general esperado.

Cuestiones relacionadas