Hoy en día, las desventajas de usar null como tipos de retorno o pasarlos como argumento se han vuelto obvias para la mayoría de los desarrolladores.
Los desarrolladores más jóvenes, incluso si no entienden, generalmente siguen un "código limpio" (después de leer un libro de Robert Martin). Por lo tanto, el código con la posibilidad de ocurrencia de NPE se ha vuelto menos común, aunque, por supuesto, lo es.
No quiero decir que cualquier uso de nulo sea malo, sino que puede decir "medir siete veces, cortar una vez".
Sin embargo, no me he quejado de NPE durante mucho tiempo, incluso cuando los desarrolladores de lenguajes con control estricto sobre este tema se jactaban de su seguridad nula. Pero debido a un error, me di cuenta de que usar nulo no es tan malo, incluso si lo devuelve o lo pasa. Por supuesto, esto es muy malo, pero hay cosas peores: nulo en las especificaciones.
No sería particularmente interesante si la historia fuera sobre una empresa que hizo una mala especificación. En su lugar, hablemos de la especificación más conocida de Java EE - Especificación de servlet de Java , específicamente tome la clase HttpServletRequest y observe el métodogetCookies()
getCookies
Cookie[] getCookies()
Devuelve una matriz que contiene todos los Cookie
objetos que el cliente envió con esta solicitud. Este método regresa null
si no se enviaron cookies.
Devoluciones:
an array of all the
Cookies
included with this request, ornull
if the request has no cookies
:
This method returns
null
if no cookies were sent.
, , null. :
, , -, , .
null
, , . ? , ?
null vs empty array
null
, , :
API, null-check
- , getCookies() null .
. ,
null
( )
, , . null , , ( ).
, .
-, , . , , , .
-, (, - )
, null
for (Cookie cookie : httpServletRequest.getCookies()) {
// NPE! // …
}
int cookiesSize = httpServletRequest.getCookies().length // NPE!
null-check:
if (httpServletRequest.getCookies() != null)
for (Cookie cookie : httpServletRequest.getCookies()) {
// …
}
Cookie[] cookies = httpServletRequest.getCookies();
int cookiesSize = cookies == null ? 0 : cookies.length
, , NPE . , .
API, . Jetty
, , .
:
return cookies == null?null:cookies.getCookies();
:
if (cookies == null || cookies.getCookies().length == 0)
return null;
return _cookies.getCookies();
, .
, , . null
, , null
. , .
!
The GNU Classpath Extensions project, aka classpathx builds free versions of Oracle's Java extension libraries, the packages in the
javax
namespace. It is a companion project of the GNU Classpath project.
Cookie[] getCookies()
Gets all the Cookies present in the request.
Returns:
an array containing all the Cookies or an empty array if there are no cookies
Since:
2.0
. null
. , Sonar, SEI CERT Oracle Coding Standart for Java
. , , , .
.
- , null . , , , , . , .
, , , . null , .
- ( ):
- ,
. - , , .
, , .
Speaking at a software conference in 2009, Tony Hoare apologized for inventing the null reference:[25]
Yo lo llamo mi error de mil millones de dólares. Fue la invención de la referencia nula en 1965. En ese momento, estaba diseñando el primer sistema de tipo completo para referencias en un lenguaje orientado a objetos ( ALGOL W ). Mi objetivo era garantizar que todo uso de referencias fuera absolutamente seguro, y que el compilador las comprobara automáticamente. Pero no pude resistir la tentación de poner una referencia nula, simplemente porque era muy fácil de implementar. Esto ha llevado a innumerables errores, vulnerabilidades y fallas del sistema, que probablemente han causado mil millones de dólares en dolor y daño en los últimos cuarenta años.