Saya ingin membuat kode saya lebih mudah dibaca serta menggunakan perkakas seperti inspeksi kode IDE dan / atau analisis kode statis (FindBugs dan Sonar) untuk menghindari NullPointerExceptions. Banyak alat yang tampaknya tidak kompatibel satu sama lain @NotNull
/ @NonNull
/ @Nonnull
anotasi dan daftar semuanya dalam kode saya akan mengerikan untuk dibaca. Adakah saran yang mana yang 'terbaik'? Berikut adalah daftar penjelasan yang setara yang saya temukan:
javax.validation.constraints.NotNull
Dibuat untuk validasi runtime, bukan analisis statis.
dokumentasiedu.umd.cs.findbugs.annotations.NonNull
Digunakan oleh analisis statis Findbugs dan karenanya dokumentasi Sonar (sekarang Sonarqube )
javax.annotation.Nonnull
Ini mungkin bekerja dengan Findbugs juga, tetapi JSR-305 tidak aktif. (Lihat juga: Apa status JSR 305? ) Sumberorg.jetbrains.annotations.NotNull
Digunakan oleh IntelliJ IDEA IDE untuk analisis statis.
dokumentasilombok.NonNull
Digunakan untuk mengontrol pembuatan kode di Proyek Lombok .
Anotasi Placeholder karena tidak ada standar.
sumber , dokumentasiandroid.support.annotation.NonNull
Anotasi penanda tersedia di Android, disediakan oleh dokumentasi paket anotasi dukungan
org.eclipse.jdt.annotation.NonNull
Digunakan oleh Eclipse untuk dokumentasi analisis kode statis
sumber
com.sun.istack.internal.NotNull
. OMG ...Jawaban:
Sejak JSR 305 (yang tujuannya adalah untuk membakukan
@NonNull
dan@Nullable
) telah aktif selama beberapa tahun, saya khawatir tidak ada jawaban yang baik. Yang bisa kita lakukan adalah menemukan solusi pragmatis dan milikku adalah sebagai berikut:Sintaksis
Dari sudut pandang gaya murni, saya ingin menghindari referensi ke IDE, framework atau toolkit apa pun kecuali Java itu sendiri.
Ini mengesampingkan:
android.support.annotation
edu.umd.cs.findbugs.annotations
org.eclipse.jdt.annotation
org.jetbrains.annotations
org.checkerframework.checker.nullness.qual
lombok.NonNull
Yang membuat kita salah
javax.validation.constraints
ataujavax.annotation
. Yang pertama dilengkapi dengan JEE. Jika ini lebih baik daripadajavax.annotation
, yang mungkin datang bersama BEJ atau tidak pernah sama sekali, adalah masalah perdebatan. Saya pribadi lebih sukajavax.annotation
karena saya tidak suka ketergantungan JEE.Ini meninggalkan kita
javax.annotation
yang juga merupakan yang terpendek.
Hanya ada satu sintaks yang bahkan akan lebih baik:
java.annotation.Nullable
. Ketika paket-paket lain lulus darijavax
kejava
masa lalu, javax.annotation akan menjadi langkah ke arah yang benar.Penerapan
Saya berharap bahwa mereka semua pada dasarnya memiliki implementasi sepele yang sama, tetapi analisis rinci menunjukkan bahwa ini tidak benar.
Pertama untuk kesamaan:
Semua
@NonNull
anotasi memiliki gariskecuali untuk
org.jetbrains.annotations
yang menyebutnya@NotNull
dan memiliki implementasi yang sepelejavax.annotation
yang memiliki implementasi lebih lamajavax.validation.constraints
yang juga menyebutnya@NotNull
dan memiliki implementasiSemua
@Nullable
anotasi memiliki gariskecuali untuk (lagi)
org.jetbrains.annotations
dengan implementasi sepele mereka.Untuk perbedaan:
Yang mengejutkan adalah itu
javax.annotation
javax.validation.constraints
org.checkerframework.checker.nullness.qual
semua memiliki anotasi runtime (
@Retention(RUNTIME)
), sementaraandroid.support.annotation
edu.umd.cs.findbugs.annotations
org.eclipse.jdt.annotation
org.jetbrains.annotations
hanya waktu kompilasi (
@Retention(CLASS)
).Seperti yang dijelaskan dalam jawaban SO ini dampak anotasi runtime lebih kecil daripada yang mungkin dipikirkan orang, tetapi mereka memiliki manfaat mengaktifkan alat untuk melakukan pemeriksaan runtime di samping waktu kompilasi.
Perbedaan penting lainnya adalah di mana dalam kode anotasi dapat digunakan. Ada dua pendekatan berbeda. Beberapa paket menggunakan konteks gaya JLS 9.6.4.1. Tabel berikut memberikan gambaran:
org.eclipse.jdt.annotation
,javax.annotation
danorg.checkerframework.checker.nullness.qual
gunakan konteks yang didefinisikan dalam JLS 4.11, yang menurut saya cara yang tepat untuk melakukannya.Ini meninggalkan kita
javax.annotation
org.checkerframework.checker.nullness.qual
di babak ini.
Kode
Untuk membantu Anda membandingkan detail lebih lanjut sendiri, saya mencantumkan kode setiap anotasi di bawah ini. Untuk memudahkan perbandingan, saya menghapus komentar, impor, dan
@Documented
anotasi. (mereka semua memiliki@Documented
kecuali kelas dari paket Android). Saya memesan ulang garis dan@Target
bidang dan menormalkan kualifikasi.Untuk kelengkapan, berikut
@Nullable
implementasinya:Dua paket berikut tidak punya
@Nullable
, jadi saya daftar secara terpisah; Lombok memiliki hal yang cukup membosankan@NonNull
. Dijavax.validation.constraints
dalam@NonNull
sebenarnya@NotNull
dan memiliki implementasi gondrong.Dukung
Dari pengalaman saya,
javax.annotation
setidaknya didukung oleh Eclipse dan Framework Checker di luar kotak.Ringkasan
Anotasi ideal saya adalah
java.annotation
sintaks dengan implementasi Framework Checker.Jika Anda tidak bermaksud menggunakan Kerangka Pemeriksa
javax.annotation
( JSR-305 ) masih merupakan taruhan terbaik Anda untuk saat ini.Jika Anda bersedia untuk membeli Kerangka Pemeriksa gunakan saja
org.checkerframework.checker.nullness.qual
.Sumber
android.support.annotation
dariandroid-5.1.1_r1.jar
edu.umd.cs.findbugs.annotations
darifindbugs-annotations-1.0.0.jar
org.eclipse.jdt.annotation
dariorg.eclipse.jdt.annotation_2.1.0.v20160418-1457.jar
org.jetbrains.annotations
darijetbrains-annotations-13.0.jar
javax.annotation
darigwt-dev-2.5.1-sources.jar
org.checkerframework.checker.nullness.qual
darichecker-framework-2.1.9.zip
lombok
darilombok
komitf6da35e4c4f3305ecd1b415e2ab1b9ef8a9120b4
javax.validation.constraints
darivalidation-api-1.0.0.GA-sources.jar
sumber
javax.annotation
ini adalah: a) berdasarkan JSR mati, b) sulit menemukan artefak yang hanya menyediakan anotasi dan dipertahankan. Yang dari findbugs bukan: search.maven.org/…javax.annotation
adalah bahwa hal itu menyebabkan masalah dengan Java 9 karena modul lain juga menyediakan kelas dalam paket itu (jax-ws).javax.annotation.NonNull
, tidak pernah selesai karena lead specnya AWOL. Itu tidak ada hubungannya dengan keputusan apa pun oleh Oracle.Saya sangat menyukai Framework Checker , yang merupakan implementasi dari anotasi tipe ( JSR-308 ) yang digunakan untuk mengimplementasikan checker cacat seperti checker nullness. Saya belum benar-benar mencoba yang lain untuk menawarkan perbandingan, tetapi saya senang dengan implementasi ini.
Saya tidak berafiliasi dengan grup yang menawarkan perangkat lunak, tetapi saya penggemar.
Empat hal yang saya sukai dari sistem ini:
Ini memiliki checker cacat untuk nullness (@Nullable), tetapi juga memiliki yang untuk kekekalan dan magang (dan lain-lain). Saya menggunakan yang pertama (nullness) dan saya mencoba menggunakan yang kedua (immutability / IGJ). Saya mencoba yang ketiga, tapi saya belum yakin menggunakannya dalam jangka panjang. Saya belum yakin akan kegunaan umum dari checker lain, tapi senang mengetahui bahwa framework itu sendiri adalah sebuah sistem untuk mengimplementasikan berbagai anotasi dan checker tambahan.
The Pengaturan standar untuk memeriksa nullness bekerja dengan baik: Non-null kecuali penduduk setempat (nnel). Pada dasarnya ini berarti bahwa secara default pemeriksa memperlakukan everyhing (variabel instance, parameter metode, tipe generik, dll) kecuali variabel lokal seolah-olah mereka memiliki tipe @NonNull secara default. Per dokumentasi:
Anda dapat mengatur standar berbeda untuk kelas atau metode jika NNEL tidak bekerja untuk Anda.
Kerangka kerja ini memungkinkan Anda untuk menggunakan tanpa membuat ketergantungan pada kerangka kerja dengan melampirkan penjelasan Anda dalam komentar: misalnya
/*@Nullable*/
. Ini bagus karena Anda dapat membuat anotasi dan memeriksa pustaka atau kode bersama, tetapi masih dapat menggunakan pustaka / kode bersama dalam proyek lain yang tidak menggunakan kerangka kerja. Ini adalah fitur yang bagus. Saya sudah terbiasa menggunakannya, meskipun saya cenderung mengaktifkan Kerangka Pemeriksa pada semua proyek saya sekarang.Kerangka kerja ini memiliki cara untuk membubuhi keterangan API yang Anda gunakan yang belum dijelaskan untuk nullness dengan menggunakan file rintisan.
sumber
Saya menggunakan IntelliJ, karena saya sebagian besar khawatir dengan IntelliJ menandai hal-hal yang mungkin menghasilkan NPE. Saya setuju bahwa frustasi karena tidak memiliki anotasi standar di JDK. Ada pembicaraan untuk menambahkannya, mungkin membuatnya menjadi Java 7. Dalam hal ini akan ada satu lagi untuk dipilih!
sumber
javax.annotation.Nonnull
lebih diterima secara luas, bukan?Menurut daftar fitur Java 7 JSR-308 anotasi jenis ditangguhkan ke Java 8. Anotasi JSR-305 bahkan tidak disebutkan.
Ada sedikit info tentang status JSR-305 dalam lampiran draft JSR-308 terbaru. Ini termasuk pengamatan bahwa anotasi JSR-305 tampaknya ditinggalkan. Halaman JSR-305 juga menunjukkannya sebagai "tidak aktif".
Sementara itu, jawaban pragmatis adalah menggunakan jenis anotasi yang didukung oleh alat yang paling banyak digunakan ... dan bersiaplah untuk mengubahnya jika situasinya berubah.
Bahkan, JSR-308 tidak mendefinisikan jenis / kelas penjelasan, dan sepertinya mereka pikir itu di luar jangkauan. (Dan mereka benar, mengingat keberadaan JSR-305).
Namun, jika JSR-308 benar-benar terlihat seperti berhasil masuk ke Java 8, tidak akan mengejutkan saya jika minat pada JSR-305 dihidupkan kembali. AFAIK, tim JSR-305 belum secara resmi meninggalkan pekerjaan mereka. Mereka baru saja diam selama 2+ tahun.
Sangat menarik bahwa Bill Pugh (pemimpin teknologi untuk JSR-305) adalah salah satu orang di belakang FindBugs.
sumber
Untuk proyek Android Anda harus menggunakan
android.support.annotation.NonNull
danandroid.support.annotation.Nullable
. Ini dan anotasi khusus Android yang bermanfaat lainnya tersedia di Perpustakaan Dukungan .Dari http://tools.android.com/tech-docs/support-annotations :
sumber
javax.annotation.*
anotasi jugaJika ada yang hanya mencari kelas IntelliJ: Anda bisa mendapatkannya dari repositori maven
sumber
JSR305 dan FindBugs ditulis oleh orang yang sama. Keduanya dipelihara dengan buruk tetapi standar seperti yang didapat dan didukung oleh semua IDE utama. Berita baiknya adalah mereka bekerja dengan baik apa adanya.
Inilah cara menerapkan @Nonnull ke semua kelas, metode, dan bidang secara default. Lihat https://stackoverflow.com/a/13319541/14731 dan https://stackoverflow.com/a/9256595/14731
@NotNullByDefault
2. Tambahkan anotasi ke setiap paket:
package-info.java
UPDATE : Pada 12 Desember 2012 JSR 305 terdaftar sebagai "Tidak Aktif". Menurut dokumentasi:
Sepertinya JSR 308 adalah membuatnya menjadi JDK 8 dan meskipun JSR tidak mendefinisikan @NotNull, yang menyertai
Checkers Framework
tidak. Pada saat penulisan ini, plugin Maven tidak dapat digunakan karena bug ini: https://github.com/typetools/checker-framework/issues/183sumber
Bedakan antara analisis statis dan analisis runtime. Gunakan analisis statis untuk hal-hal internal, dan analisis runtime untuk batas publik kode Anda.
Untuk hal-hal yang tidak boleh nol:
Pemeriksaan runtime: Gunakan "jika (x == null) ..." (nol ketergantungan) atau @ javax.validation.NotNull (dengan validasi kacang) atau @ lombok.NonNull (polos dan sederhana) atau jambu biji Preconditions.checkNotNull (.. .)
Pemeriksaan statis: Gunakan anotasi @NonNull
Ini harus memberikan hasil terbaik: peringatan di IDE, kesalahan oleh Findbugs dan checkerframework, pengecualian runtime yang berarti.
Jangan berharap pemeriksaan statis menjadi matang, penamaannya tidak standar dan pustaka dan IDE yang berbeda memperlakukannya secara berbeda, abaikan saja. Kelas JSR305 javax.annotations. * Terlihat seperti standar, tetapi tidak, dan menyebabkan paket terpisah dengan Java9 +.
Beberapa penjelasan penjelasan:
Sebelum Java9, ini adalah rekomendasi saya:
Perhatikan bahwa tidak ada cara untuk membuat Spotbugs membangkitkan peringatan ketika parameter metode nullable dereferenced (pada saat penulisan, versi 3.1 dari Spotbugs). Mungkin checkerframework bisa melakukannya.
Sayangnya, anotasi ini tidak membedakan antara kasus-kasus metode umum perpustakaan dengan panggilan sewenang-wenang, dan metode non-publik di mana setiap lokasi panggilan dapat diketahui. Jadi makna ganda dari: "Tunjukkan bahwa null tidak diinginkan, tetapi persiapkan untuk null yang disahkan" tidak mungkin dalam satu deklarasi, oleh karena itu contoh di atas memiliki anotasi yang berbeda untuk antarmuka dan implementasi.
Untuk kasus-kasus di mana pendekatan pemisahan antarmuka tidak praktis, pendekatan berikut adalah kompromi:
Ini membantu klien untuk tidak lulus nol (menulis kode yang benar), sambil mengembalikan kesalahan yang bermanfaat jika mereka melakukannya.
sumber
Eclipse juga memiliki anotasi sendiri.
Lihat di http://wiki.eclipse.org/JDT_Core/Null_Analysis untuk detailnya.
sumber
Hanya menunjukkan bahwa Java Validation API (
javax.validation.constraints.*
) tidak datang dengan@Nullable
anotasi, yang sangat berharga dalam konteks analisis statis. Masuk akal untuk validasi kacang runtime karena ini adalah default untuk setiap bidang non-primitif di Jawa (yaitu tidak ada yang memvalidasi / menegakkan). Untuk tujuan yang dinyatakan harus mempertimbangkan alternatif.sumber
Sayangnya,
JSR 308
tidak akan menambahkan nilai lebih dari proyek ini. Tidak ada saran Null di siniJava 8
tidak akan datang dengan anotasi standar tunggal atauChecker
kerangka kerjanya sendiri . Mirip dengan Find-bug atauJSR 305
, JSR ini tidak dikelola dengan baik oleh sekelompok kecil tim akademis.Tidak ada kekuatan komersial di baliknya, sehingga
JSR 308
meluncurkanEDR 3
(Early Draft Review atJCP
) SEKARANG, sementaraJava 8
seharusnya dikirimkan dalam waktu kurang dari 6 bulan: -O Mirip dengan310
btw. tetapi tidak seperti yang308 Oracle
telah mengambil alih itu sekarang jauh dari pendirinya untuk meminimalkan bahaya itu akan dilakukan ke Platform Java.Setiap proyek, vendor dan kelas akademik seperti yang ada di belakang
Checker Framework
danJSR 308
akan membuat anotasi pemeriksa hak miliknya sendiri.Membuat kode sumber yang tidak kompatibel tahun-tahun mendatang, sampai beberapa kompromi populer dapat ditemukan dan mungkin ditambahkan ke
Java 9
atau10
, atau melalui kerangka kerja sepertiApache Commons
atauGoogle Guava
;-)sumber
Android
Jawaban ini khusus untuk Android. Android memiliki paket dukungan yang disebut
support-annotations
. Ini menyediakan puluhan dari spesifik Android penjelasan dan juga menyediakan yang umum sepertiNonNull
,Nullable
dllUntuk menambahkan paket anotasi dukungan , tambahkan dependensi berikut di build.gradle Anda:
lalu gunakan:
sumber
Sambil menunggu ini diselesaikan di hulu (Java 8?), Anda juga bisa mendefinisikan proyek-lokal
@NotNull
dan@Nullable
anotasi Anda sendiri . Ini dapat berguna juga jika Anda bekerja dengan Java SE, di manajavax.validation.constraints
tidak tersedia secara default.Ini diakui sebagian besar untuk tujuan dekoratif atau pembuktian di masa depan, karena di atas jelas tidak dengan sendirinya menambah dukungan untuk analisis statis anotasi ini.
sumber
Jika Anda mengembangkan untuk android, Anda agak terikat dengan Eclipse (edit: pada saat penulisan, tidak lagi), yang memiliki anotasi sendiri. Ini termasuk dalam Eclipse 3.8+ (Juno), tetapi dinonaktifkan secara default.
Anda dapat mengaktifkannya di Preferensi> Java> Kompiler> Kesalahan / Peringatan> Analisis kosong (bagian yang dapat diciutkan di bagian bawah).
Centang "Aktifkan analisis nol berbasis anotasi"
http://wiki.eclipse.org/JDT_Core/Null_Analysis#Usage memiliki rekomendasi tentang pengaturan. Namun, jika Anda memiliki proyek eksternal di ruang kerja Anda (seperti SDK facebook), mereka mungkin tidak memenuhi rekomendasi tersebut, dan Anda mungkin tidak ingin memperbaikinya dengan setiap pembaruan SDK ;-)
Saya menggunakan:
sumber
@chaqke
.Jika Anda mengerjakan proyek besar, Anda mungkin lebih baik membuat sendiri
@Nullable
dan / atau@NotNull
anotasi.Sebagai contoh:
Jika Anda menggunakan kebijakan penyimpanan yang benar , maka anotasi tidak akan tersedia saat runtime . Dari sudut pandang itu, itu hanya hal internal .
Meskipun ini bukan ilmu yang ketat, saya pikir paling masuk akal untuk menggunakan kelas internal untuk itu.
@Nullable
/@NotNull
anotasi.Pertanyaan Tambahan (lihat komentar):
Bagaimana cara mengkonfigurasi ini di IntelliJ?
sumber
idea
jangan katakan tentangvoid test(@NonNull String s) {}
dipanggil olehtest(null);
Sudah ada terlalu banyak jawaban di sini, tetapi (a) ini tahun 2019, dan masih belum ada "standar"
Nullable
dan (b) tidak ada jawaban lain yang merujuk Kotlin.Referensi ke Kotlin penting, karena Kotlin 100% dapat dioperasikan dengan Java dan memiliki fitur inti Null Safety. Saat memanggil pustaka Java, itu bisa memanfaatkan anotasi tersebut untuk memberi tahu Kotlin alat apakah API Java dapat menerima atau kembali
null
.Sejauh yang saya tahu, satu-satunya
Nullable
paket yang kompatibel dengan Kotlin adalahorg.jetbrains.annotations
danandroid.support.annotation
(sekarangandroidx.annotation
). Yang terakhir hanya kompatibel dengan Android sehingga tidak dapat digunakan dalam proyek JVM / Java / Kotlin non-Android. Namun, paket JetBrains bekerja di mana-mana.Jadi, jika Anda mengembangkan paket Java yang juga harus berfungsi di Android dan Kotlin (dan didukung oleh Android Studio dan IntelliJ), pilihan terbaik Anda mungkin adalah paket JetBrains.
Maven:
Gradle:
sumber
Ada cara lain untuk melakukan ini di Jawa 8. Saya melakukan 2 hal untuk mencapai apa yang saya butuhkan:
java.util.Optional
java.util.Objects.requireNonNull
Contoh:
Jadi pertanyaan saya adalah, apakah kita perlu membuat catatan ketika menggunakan java 8?
Sunting: Saya menemukan kemudian bahwa beberapa menganggap praktik buruk untuk digunakan
Optional
dalam argumen, ada diskusi yang baik dengan pro dan kontra di sini Mengapa Java 8's Opsional tidak boleh digunakan dalam argumenOpsi alternatif mengingat bahwa tidak disarankan untuk menggunakan Opsional dalam argumen, kita membutuhkan 2 konstruktor:
sumber
new Role(null,null,null,null);
. Dengan anotasi, IDE dan analisis statis saya akan memperingatkan bahwa nol tidak dapat diteruskan ke parameter tersebut. Tanpa itu saya tidak tahu sampai saya menjalankan kode. Itulah nilai dari anotasi.description
tidak nol dan kode klien dapat melewati String kosong, tetapi dalam banyak kasus mungkin berguna untuk membedakan antara String kosong dan dan tidak memiliki nilai. Terima kasih atas komentar Anda. Saya akan memperbarui jawabannya.Tidakkah matahari punya matahari sendiri sekarang? Apa ini:
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-com.sun/istack/com.sun.istack.internal.htm
Ini sepertinya dikemas dengan semua versi Jawa yang saya gunakan dalam beberapa tahun terakhir.
Sunting: Seperti disebutkan dalam komentar di bawah, Anda mungkin tidak ingin menggunakannya. Dalam hal itu, suara saya adalah untuk anotasi jetbrains IntelliJ!
sumber
Salah satu hal baik tentang IntelliJ adalah Anda tidak perlu menggunakan anotasi mereka. Anda dapat menulis sendiri, atau menggunakan alat apa pun yang Anda suka. Anda bahkan tidak terbatas pada satu tipe pun. Jika Anda menggunakan dua pustaka yang menggunakan anotasi @NotNull yang berbeda, Anda bisa memberi tahu IntelliJ untuk menggunakan keduanya. Untuk melakukan ini, buka "Konfigurasikan Inspeksi", klik pada inspeksi "Kondisi & Pengecualian Konstan", dan tekan tombol "Konfigurasikan inspeksi". Saya menggunakan Nullness Checker di mana pun saya bisa, jadi saya mengatur IntelliJ untuk menggunakan anotasi tersebut, tetapi Anda dapat membuatnya bekerja dengan alat apa pun yang Anda inginkan. (Saya tidak memiliki pendapat tentang alat-alat lain karena saya telah menggunakan inspeksi IntelliJ selama bertahun-tahun, dan saya menyukainya.)
sumber
Pilihan lain adalah anotasi yang disediakan dengan ANTLR 4. Mengikuti Permintaan Tarik # 434 , artefak yang berisi
@NotNull
dan@Nullable
anotasi mencakup prosesor anotasi yang menghasilkan kesalahan waktu kompilasi dan / atau peringatan jika salah satu atribut ini disalahgunakan (misalnya, jika keduanya diterapkan pada item yang sama, atau jika@Nullable
diterapkan pada item dengan tipe primitif). Prosesor anotasi memberikan jaminan tambahan selama proses pengembangan perangkat lunak bahwa informasi yang disampaikan oleh aplikasi anotasi ini akurat, termasuk dalam kasus pewarisan metode.sumber
Jika Anda sedang membangun aplikasi Anda menggunakan Spring Framework saya sarankan menggunakan
javax.validation.constraints.NotNull
coming dari Beans Validation yang dikemas dalam dependensi berikut:Keuntungan utama anotasi ini adalah Spring memberikan dukungan untuk parameter metode dan bidang kelas yang dianotasi
javax.validation.constraints.NotNull
. Yang perlu Anda lakukan untuk mengaktifkan dukungan adalah:memasok api jar untuk validasi kacang dan jar dengan implementasi validator jsr-303 / jsr-349 anotasi (yang dilengkapi dengan Hibernate Validator 5.x dependensi):
memberikan MethodValidationPostProcessor ke konteks pegas
akhirnya Anda membubuhi keterangan kelas Anda dengan Spring
org.springframework.validation.annotation.Validated
dan validasi akan secara otomatis ditangani oleh Spring.Contoh:
Ketika Anda mencoba memanggil metode doSomething dan lulus nol sebagai nilai parameter, pegas (dengan menggunakan HibernateValidator) akan melempar
ConstraintViolationException
. Tidak perlu bekerja secara manual di sini.Anda juga dapat memvalidasi nilai kembali.
Manfaat penting lainnya dari
javax.validation.constraints.NotNull
Coming for Beans Validation Framework adalah bahwa saat ini masih dikembangkan dan fitur baru direncanakan untuk versi 2.0 yang baru.Bagaimana dengan
@Nullable
? Tidak ada yang seperti itu di Beans Validation 1.1. Yah, saya bisa berpendapat bahwa jika Anda memutuskan untuk menggunakan@NotNull
daripada segala sesuatu yang TIDAK dijelaskan dengan@NonNull
efektif "nullable", maka@Nullable
penjelasannya tidak berguna.sumber
Spring 5 memiliki @NonNullApi di tingkat paket. Ini sepertinya pilihan yang nyaman untuk proyek yang sudah memiliki dependensi Spring. Semua bidang, parameter, dan nilai pengembalian default ke @NonNull dan @Nullable dapat diterapkan di beberapa tempat yang berbeda.
Paket file-info.java:
https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.nullability.annotations
sumber