¿Usas null a menudo? Y lo tenemos en la especificación

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, or null



    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



. , .





!

, , , . , ? , ?





, classpathx





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.








All Articles