Saat menggunakan kelas Java 8 Optional
, ada dua cara di mana nilai dapat dibungkus dalam opsional.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Saya mengerti Optional.ofNullable
adalah satu-satunya cara aman untuk menggunakan Optional
, tetapi mengapa Optional.of
ada? Mengapa tidak menggunakan saja Optional.ofNullable
dan berada di sisi yang aman setiap saat?
java.util.Optional
- Ini tersedia jika Anda menggunakan JDK 8 atau lebih baruofNullable()
menamaiof()
danof()
menamaiofNotNull()
Jawaban:
Pertanyaan Anda didasarkan pada asumsi bahwa kode yang mungkin dibuang
NullPointerException
lebih buruk daripada kode yang tidak. Anggapan ini salah. Jika Anda berharap bahwa Andafoobar
tidak pernah nol karena logika program, itu jauh lebih baik untuk digunakanOptional.of(foobar)
karena Anda akan melihatNullPointerException
yang akan menunjukkan bahwa program Anda memiliki bug. Jika Anda menggunakanOptional.ofNullable(foobar)
danfoobar
kebetulannull
karena bug, maka program Anda akan terus bekerja secara tidak benar, yang mungkin merupakan bencana yang lebih besar. Dengan cara ini kesalahan dapat terjadi jauh kemudian dan akan jauh lebih sulit untuk memahami pada titik mana kesalahan itu terjadi.sumber
Optional.of(foobar)
". Ini sepertinya agak aneh - ketika kita tahu bahwa nilainya tidak akannull
dalam hal apa pun, lalu mengapa tidak menggunakan nilai itu sendiri, alih-alih membungkusnya dalam suatuOptional
?Optional
dari metode seperti yang diperlukan oleh antarmuka yang Anda laksanakan (mungkin implementator lain dapat mengembalikan opsional kosong). Atau Anda ingin membuat koleksi / aliran opsional, beberapa di antaranya dijamin bukan nol dan ada yang tidak. Atau Anda memiliki logika kondisional yang membuat opsional di beberapa cabang dan di cabang tunggal Anda yakin itu bukan nol.null
dalam hal ini berarti "Saya berharap foobar hadir, tetapi karena bug itu nol".Optional.isPresent() == false
berarti foobar tidak ada, artinya ini diharapkan, perilaku yang sah.return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));
yanglist
diharapkan tidak pernah mengandungnull
nilai-nilai ...Selain itu, Jika Anda tahu kode Anda seharusnya tidak berfungsi jika objeknya nol, Anda bisa melempar pengecualian dengan menggunakan
Optional.orElseThrow
sumber
String name = Objects.requireNonNull(nullName);
NullPointerException
ketika masalahnya jelas merupakan referensi yangnull
seharusnya tidak dilakukan, akan menjadi langkah ke arah yang salah.new NullNameException("meaningful msg")
Ini tergantung pada skenario.
Katakanlah Anda memiliki beberapa fungsionalitas bisnis dan Anda perlu memproses sesuatu dengan nilai itu lebih lanjut tetapi memiliki
null
nilai pada saat pemrosesan akan berdampak padanya.Lalu, dalam hal itu, Anda bisa menggunakan
Optional<?>
.sumber
Opsional terutama harus digunakan untuk hasil Layanan. Dalam layanan Anda tahu apa yang Anda miliki dan mengembalikan Optional.of (someValue) jika Anda memiliki hasil dan mengembalikan Optional.empty () jika Anda tidak. Dalam hal ini, beberapa nilai tidak boleh nol dan tetap, Anda mengembalikan Opsional.
sumber