Saat ini, kelemahan menggunakan null sebagai tipe kembalian atau meneruskannya sebagai argumen telah menjadi jelas bagi sebagian besar developer.
Pengembang muda, meskipun mereka tidak mengerti, biasanya mengikuti "kode bersih" (setelah membaca buku oleh Robert Martin). Oleh karena itu, kode dengan kemungkinan terjadinya NPE menjadi kurang umum, meskipun, tentu saja, memang demikian.
Saya tidak ingin mengatakan bahwa penggunaan nol itu buruk, tetapi Anda dapat mengatakan "ukur tujuh kali, potong sekali".
Namun, saya tidak pernah mengeluh tentang NPE untuk waktu yang lama, bahkan ketika pengembang dari bahasa dengan kontrol ketat pada topik ini membual tentang keamanan nol mereka. Tetapi karena satu bug, saya menyadari bahwa hanya menggunakan null tidak terlalu buruk, bahkan jika Anda mengembalikan atau meneruskannya. Tentu saja, ini sangat buruk, tetapi ada hal-hal yang lebih buruk - nol dalam spesifikasi.
Tidak akan terlalu menarik jika ceritanya tentang satu perusahaan yang membuat spesifikasi yang buruk. Mari kita bicara tentang spesifikasi yang lebih terkenal dari Java EE - Spesifikasi Servlet Java , secara khusus mengambil kelas HttpServletRequest dan melihat ke dalam metodegetCookies()
getCookies
Cookie[] getCookies()
Mengembalikan larik yang berisi semua Cookie
objek yang dikirim klien dengan permintaan ini. Metode ini kembali null
jika tidak ada cookie yang dikirim.
Pengembalian:
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]
Saya menyebutnya kesalahan miliaran dolar saya. Itu adalah penemuan referensi nol pada tahun 1965. Saat itu, saya sedang merancang sistem tipe komprehensif pertama untuk referensi dalam bahasa berorientasi objek ( ALGOL W ). Tujuan saya adalah untuk memastikan bahwa semua penggunaan referensi harus benar-benar aman, dengan pemeriksaan yang dilakukan secara otomatis oleh kompilator. Tetapi saya tidak dapat menahan godaan untuk memasukkan referensi nol, hanya karena itu sangat mudah untuk diterapkan. Hal ini telah menyebabkan kesalahan, kerentanan, dan kerusakan sistem yang tak terhitung banyaknya, yang mungkin menyebabkan sakit dan kerusakan bernilai miliaran dolar dalam empat puluh tahun terakhir.