Anotasi Keselamatan Musim Gugur

1. Gambaran keseluruhan

Bermula dengan Spring 5, kami kini mempunyai akses ke ciri menarik yang membantu kami menulis kod yang lebih selamat. Ciri ini dipanggil keselamatan nol, sekumpulan anotasi berfungsi seperti perlindungan yang memerhatikan kemungkinan rujukan nol.

Daripada membiarkan kita melepaskan kod yang tidak selamat, ciri keselamatan nol menghasilkan peringatan pada waktu penyusunan. Amaran seperti itu dapat mengelakkan pengecualian penunjuk null (NPE) bencana pada waktu runtime.

2. Anotasi @NonNull

The @NonNull anotasi adalah yang paling penting di antara semua penjelasan daripada ciri null-keselamatan. Kita dapat menggunakan penjelasan ini untuk menyatakan pengekangan bukan nol di mana sahaja rujukan objek diharapkan: medan, parameter kaedah atau nilai pengembalian kaedah.

Katakan kita mempunyai 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 adalah sah, tetapi cacat - yang FULLNAME bidang yang dinyatakan untuk null . Sekiranya ini berlaku, kita boleh berakhir dengan NPE ketika bekerja dengan nama penuh .

Ciri keselamatan null Spring membolehkan alat melaporkan bahaya tersebut. Sebagai contoh, jika kita menulis kod dalam IntelliJ IDEA dan menghiasi FULLNAME bidang dengan @NonNull anotasi, kami akan melihat amaran:

Berkat petunjuk ini, kami menyedari masalahnya terlebih dahulu dan dapat mengambil tindakan yang sewajarnya untuk mengelakkan kegagalan waktu proses.

3. Anotasi @NonNullFields

The @NonNull anotasi membantu dalam menjamin null-keselamatan. Walau bagaimanapun, kami akan mencemarkan keseluruhan pangkalan kod jika menghiasi semua bidang yang tidak kosong dengan anotasi ini.

Kami dapat mengelakkan penyalahgunaan @NonNull dengan anotasi lain - @NonNullFields . Anotasi ini berlaku di tingkat pakej, memberitahu alat pengembangan kami bahawa semua bidang dalam pakej yang diberi anotasi, secara lalai, tidak kosong.

Untuk penjelasan @NonNullFields , kita perlu membuat fail bernama package-info.java di direktori root pakej dan memberi anotasi pakej dengan @NonNullFields :

@NonNullFields package org.baeldung.nullibility;

Mari nyatakan harta lain di kelas Person , yang dipanggil 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, kami tidak menghiasi NICKNAME bidang dengan @NonNull tetapi masih melihat kaveat yang sama:

The @NonNullFields anotasi menjadikan kod kami kurang lantung di samping memastikan tahap yang sama keselamatan yang @NonNull menyediakan.

4. Anotasi @Nullable

The @NonNullFields anotasi umumnya lebih baik untuk @NonNull kerana ia membantu mengurangkan boilerplate. Kadang-kadang kita ingin mengecualikan beberapa bidang dari kekangan bukan nol yang ditentukan pada tahap pakej.

Mari kembali ke medan nama samaran dan menghiasnya dengan anotasi @Nullable :

@Nullable private String nickName;

Amaran yang kita lihat sebelum ini hilang sekarang:

Dalam keadaan ini, kami menggunakan anotasi @Nullable untuk mengatasi semantik @NonNullFields di lapangan.

5. Anotasi @NonNullApi

The @NonNullFields anotasi hanya boleh digunakan untuk, seperti namanya, bidang. Sekiranya kami ingin memberi kesan yang sama pada parameter kaedah dan nilai pengembalian, kami memerlukan @NonNullApi .

Seperti @NonNullFields , kita mesti menentukan @NonNullApi anotasi dalam package-info.java fail:

@NonNullApi package org.baeldung.nullibility;

Mari tentukan pengambil untuk bidang nama samaran :

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

Dengan pemberian anotasi @NonNullApi , amaran dikeluarkan mengenai kemungkinan nilai nol yang dihasilkan oleh kaedah getNickName :

Perhatikan bahawa seperti anotasi @NonNullFields , kita juga boleh mengatasi @NonNullApi pada tahap kaedah dengan anotasi @Nullable .

6. Kesimpulannya

Safety null-safety adalah ciri hebat yang membantu mengurangkan kemungkinan NPE. Namun, ada dua perkara penting yang perlu kita perhatikan semasa menggunakan ciri ini:

  • Ia hanya dapat digunakan dalam alat pembangunan yang menyokong, seperti IntelliJ IDEA
  • Ia tidak melaksanakan pemeriksaan nol pada waktu berjalan - kita masih perlu menulis kod sendiri untuk mengelakkan NPE

Kod sumber untuk tutorial ini boleh didapati di GitHub.