@ Penggunaan penjelasan anotasi

347

Saya melihat beberapa metode di java dinyatakan sebagai:

void foo(@Nullable Object obj)
{ ... }

Apa artinya di @Nullablesini? Apakah ini berarti inputnya bisa null?

Tanpa anotasi, input masih bisa nol, jadi kurasa bukan itu saja?

pengguna1508893
sumber
3
Dari jawaban di bawah ini, saya telah belajar bahwa anotasi menunjukkan nilai nol dapat diterima, contoh penggunaannya, penganalisa kode yang dapat saya coba dan interpretasi dapat bervariasi. Lihat mengapa format ini bagus? +1 semua bulat, terutama untuk menanyakan pertanyaan ini.
icedwater
8
Pustaka mana yang menyediakan @Nullabledalam konteks pertanyaan Anda? Apakah ini Pemeriksa?
8bitjunkie

Jawaban:

367

Itu memperjelas bahwa metode menerima nilai nol, dan bahwa jika Anda mengganti metode, Anda juga harus menerima nilai nol.

Ini juga berfungsi sebagai petunjuk untuk penganalisa kode seperti FindBugs . Misalnya, jika metode seperti itu meringkas argumennya tanpa memeriksa nol terlebih dahulu, FindBugs akan memancarkan peringatan.

JB Nizet
sumber
82

Anotasi ini biasanya digunakan untuk menghilangkan NullPointerExceptions. @Nullablemengatakan bahwa parameter ini mungkin null. Contoh yang baik dari perilaku tersebut dapat ditemukan di Google Guice . Dalam kerangka kerja injeksi ketergantungan ringan ini Anda dapat mengatakan bahwa ketergantungan ini mungkin null. Jika Anda mencoba untuk lulus nulltanpa anotasi, kerangka kerja akan menolak untuk melakukan tugasnya.

Terlebih lagi @Nullablemungkin digunakan dengan @NotNullanotasi. Di sini Anda dapat menemukan beberapa tips tentang cara menggunakannya dengan benar. Inspeksi kode di IntelliJ memeriksa anotasi dan membantu men-debug kode.

Adam Sznajder
sumber
1

Memang, ada pemikiran yang sangat berbeda, di dunia saya, saya tidak bisa memaksakan "Never pass a null" karena saya berurusan dengan pihak ketiga yang tidak terkendali seperti penelepon API, catatan database, mantan programmer dll ... jadi saya paranoid dan defensif dalam pendekatan . Karena Anda menggunakan Java8 atau lebih baru, ada pendekatan yang sedikit lebih bersih daripada ifblok.

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

Anda juga dapat melempar beberapa pengecualian di sana dengan bertukar .orElseke orElseThrow(() -> new Exception("Dont' send a null")).

Jika Anda tidak ingin menggunakan @Nullable, yang tidak menambahkan apa-apa secara fungsional, mengapa tidak hanya memberi nama parameter dengan mayBe...begitu niat Anda jelas.

Manabu Tokunaga
sumber