Anotasi Spring Null-Safety

1. Ikhtisar

Dimulai dengan Spring 5, sekarang kita memiliki akses ke fitur menarik yang membantu kita menulis kode yang lebih aman. Fitur ini disebut null-safety, sekelompok anotasi yang berfungsi seperti pengaman yang mengawasi potensi referensi null.

Daripada membiarkan kita lolos dengan kode yang tidak aman, fitur keamanan null menghasilkan peringatan pada waktu kompilasi. Peringatan tersebut dapat mencegah pengecualian penunjuk nol (NPE) bencana pada saat runtime.

2. Anotasi @NonNull

The @NonNull penjelasan adalah yang paling penting di antara semua penjelasan dari fitur null-keselamatan. Kita bisa menggunakan anotasi ini untuk mendeklarasikan batasan bukan nol di mana pun referensi objek diharapkan: bidang, parameter metode, atau nilai kembalian metode.

Misalkan kita memiliki kelas bernama Person :

public class Person { private String fullName; void setFullName(String fullName) { if (fullName != null && fullName.isEmpty()) { fullName = null; } this.fullName = fullName; } // getter }

Definisi kelas ini berlaku, tetapi memiliki cacat - yang fullName bidang mungkin diatur ke nol . Jika ini terjadi, kami bisa mendapatkan NPE saat bekerja dengan fullName .

Fitur keamanan nol Spring memungkinkan alat untuk melaporkan bahaya seperti itu. Misalnya, jika kita menulis kode di IntelliJ IDEA dan menghias bidang fullName dengan anotasi @NonNull , kita akan melihat peringatan:

Berkat indikasi ini, kami menyadari masalah tersebut sebelumnya dan dapat mengambil tindakan yang tepat untuk menghindari kegagalan waktu proses.

3. Anotasi @NonNullFields

The @NonNull penjelasan ini membantu dalam menjamin null-keselamatan. Namun, kami akan mencemari seluruh basis kode jika menghiasi semua bidang bukan nol dengan anotasi ini.

Kita dapat menghindari penyalahgunaan @NonNull dengan anotasi lain - @NonNullFields . Anotasi ini berlaku di tingkat paket, memberi tahu alat pengembangan kami bahwa semua bidang dalam paket beranotasi, secara default, bukan null.

Agar anotasi @NonNullFields dimulai , kita perlu membuat file bernama package-info.java di direktori root paket dan menganotasi paket dengan @NonNullFields :

@NonNullFields package org.baeldung.nullibility;

Mari deklarasikan properti lain di kelas Person , yang disebut nickName :

package org.baeldung.nullibility; // import statements public class Person { private String nickName; void setNickName(@Nullable String nickName) { if (nickName != null && nickName.isEmpty()) { nickName = null; } this.nickName = nickName; } // other declarations }

Kali ini, kita tidak memperindah julukan lapangan dengan @NonNull tapi masih melihat peringatan yang sama:

The @NonNullFields penjelasan membuat kode kita kurang verbose sambil memastikan tingkat yang sama keselamatan yang @NonNull menyediakan.

4. Anotasi @Nullable

The @NonNullFields penjelasan umumnya lebih baik untuk @NonNull karena membantu mengurangi boilerplate. Kadang-kadang kami ingin mengecualikan beberapa bidang dari batasan non-null yang ditentukan pada tingkat paket.

Mari kembali ke bidang nickName dan hiasi dengan anotasi @Nullable :

@Nullable private String nickName;

Peringatan yang kita lihat sebelumnya hilang sekarang:

Dalam situasi ini, kami menggunakan anotasi @Nullable untuk mengganti semantik @NonNullFields di bidang.

5. Anotasi @NonNullApi

The @NonNullFields penjelasan hanya berlaku untuk, seperti namanya, bidang. Jika kita ingin memiliki dampak yang sama pada parameter metode dan nilai kembalian, kita memerlukan @NonNullApi .

Seperti @NonNullFields , kita harus menentukan @NonNullApi penjelasan dalam package-info.java berkas:

@NonNullApi package org.baeldung.nullibility;

Mari kita tentukan pengambil untuk bidang nickName :

package org.baeldung.nullibility; // import statements public class Person { @Nullable private String nickName; String getNickName() { return nickName; } // other declarations }

Dengan anotasi @NonNullApi berlaku, peringatan dikeluarkan tentang kemungkinan nilai null yang dihasilkan oleh metode getNickName :

Perhatikan bahwa seperti anotasi @NonNullFields , kita dapat mengganti @NonNullApi pada tingkat metode dengan anotasi @Nullable .

6. Kesimpulan

Spring null-safety adalah fitur hebat yang membantu mengurangi kemungkinan NPE. Namun, ada dua poin penting yang perlu kita waspadai saat menggunakan fitur ini:

  • Ini hanya dapat digunakan dalam alat pengembangan pendukung, seperti IntelliJ IDEA
  • Itu tidak memberlakukan pemeriksaan nol saat runtime - kita masih perlu menulis kode sendiri untuk mencegah NPE

Kode sumber untuk tutorial ini dapat ditemukan di GitHub.