java.util.Objects.isNull vs object == null

91

Seperti yang Anda ketahui, java.util.Objectsadalah

Kelas ini terdiri dari metode utilitas statis untuk beroperasi pada objek.

Salah satu metode tersebut adalah Objects.isNull().

Pemahaman saya adalah bahwa itu Objects.isNull()akan menghilangkan kemungkinan tidak sengaja memberikan nilai null ke objek dengan menghilangkan yang kedua =.

Namun, Catatan API menyatakan:

Metode ini ada untuk digunakan sebagai Predikat, filter (Objects :: isNull)

Akankah ada alasan / keadaan yang saya harus menggunakan object == nulllebih Objects.isNull()dalam pernyataan jika ?

Haruskah Objects.isNull()dibatasi pada Predikat secara eksklusif?

Lucas T.
sumber
4
Jika semua yang Anda khawatirkan adalah tugas yang tidak disengaja, Anda dapat menggunakan if(null == variable)secara konsisten…
Holger
1
@ Tuan, tugas tidak disengaja apa yang perlu dikhawatirkan? Ini Jawa. Anda akan mendapatkan kesalahan tipe.
Louis Wasserman
1
@LouisWasserman Tidak jika variableadalah Boolean.
Alexis C.
2
@AlexisC, itu akan menjadi perhatian dalam sejumlah kecil kasus: variabel Anda harus tipe yang sangat spesifik, dan Anda harus membuat kesalahan ketik yang sangat spesifik, dan Anda tidak dapat menggunakan IDE atau analisis kompiler yang akan menunjukkan hal itu untuk Anda (seperti yang dilakukan hampir semua IDE). Saya cukup nyaman untuk tidak mengkhawatirkan kasus itu.
Louis Wasserman
1
Di tempat kerja, saya telah melihat banyak contoh objek null == . Ketika saya bertanya, saya diberitahu bahwa itu untuk mencegah tugas batal yang tidak disengaja. Berdasarkan komentar dan jawaban yang diberikan di sini, saya cenderung percaya bahwa ini adalah materi selera.
Lucas T

Jawaban:

82

harus menggunakan object == null di atas Objects.isNull () dalam pernyataan if?

Jika Anda melihat kode sumber dari IsNullmetode,

 /* Returns true if the provided reference is null otherwise returns false.*/

 public static boolean isNull(Object obj) {
     return obj == null;
 }

Sama. Tidak ada perbedaan. Jadi Anda bisa menggunakannya dengan aman.

Suresh Atta
sumber
14
Ya, ini dapat digunakan, tetapi dapat mengganggu analisis aliran lokal yang dilakukan oleh suatu alat. Yaitu, dengan "==" biasa, analisis aliran apa pun dapat melihat bahwa dereferensi tidak baik di cabang lalu, tetapi aman di cabang lain. Anda akan mendapatkan kesalahan / peringatan yang sesuai atau tidak sama sekali. Dengan tipuan memanggil isNull () pengetahuan itu mungkin hilang ke alat.
Stephan Herrmann
3
Ada sedikit perbedaan kinerja. Java memeriksa referensi null objek versus memanggil metode statis akan memiliki perbedaan. Dan itu terbaca sedikit kurang jelas daripada hanya menggunakan == yang biasa kita semua gunakan.
Kevin M
3
Lebih banyak digunakan == nulldalam semantik if, tetapi isNull sangat bagus untuk digunakan pada ekspresi lambda.
Leonardo Ramos Duarte
1
itu pasti sah, tetapi tidak memiliki keuntungan apapun atas operatornya. Jadi jika Anda bekerja dalam tim, mohon gunakan hal-hal sesuai dengan tujuan yang dimaksudkan.
Alex Panchenko
78

Objects.isNull dimaksudkan untuk digunakan dalam pemfilteran lambda Java 8.

Jauh lebih mudah dan lebih jelas untuk menulis:

.stream().filter(Objects::isNull) 

daripada menulis:

.stream().filter(x -> x == null).  

Dalam sebuah ifpernyataan, bagaimanapun, keduanya akan berhasil. Penggunaan dari == nullmungkin lebih mudah untuk dibaca tetapi pada akhirnya akan bermuara pada preferensi gaya.

Craig Taylor
sumber
12

Lihat sumbernya:

public static boolean isNull(Object obj) {
    return obj == null;
}

Untuk memeriksa nullnilai, Anda dapat menggunakan:

  • Objects.isNull(myObject)
  • null == myObject // avoids assigning by typo
  • myObject == null // risk of typo

Fakta yang Objects.isNulldimaksudkan untuk Predicates tidak menghalangi Anda untuk menggunakannya seperti di atas.

Mena
sumber
1
Apa yang Anda maksud dengan risiko salah ketik?
Ashish Lohia
2
@AshishLohia dengan menggunakan =alih-alih ==(tidak akan dikompilasi kecuali itu adalah Booleanpembungkus nullable , yo be fair)
Mena
5
Risiko salah ketik adalah masalah di C ++ bukan di Java jika (myObject = null) akan menghasilkan kesalahan kompilasi. Anda harus selalu menggunakan myObject == null di atas null == myObject.
Tomas Marik
1
@TomasMarik sebagaimana disebutkan dalam komentar saya, risiko salah ketik terbatas pada Booleanpembungkus nullable di Jawa. Ini memang sangat jarang (dan akan memberikan peringatan compiler ketika sebuah tugas untuk nulldicentang seolah-olah itu adalah kondisi), tetapi bukan tidak mungkin.
Mena
7

Apakah ada alasan / keadaan di mana saya harus menggunakan object == null di atas Objects.isNull () dalam pernyataan if ?

Ya, salah satu alasannya adalah agar kode tetap sederhana. Dalam pernyataan if object == null jelas dan terkenal. Itu tidak dapat menyebabkan kesalahan apa pun jika misalnya ada kesalahan ketik.

Pemahaman saya adalah bahwa Objects.isNull () akan menghilangkan kemungkinan tidak sengaja memberikan nilai null ke objek dengan menghilangkan kedua =.

Jika ada if (object = null) {}dengan yang dihilangkan = itu tidak akan dikompilasi atau akan menghasilkan peringatan jika ada Booleanobjek! Sebenarnya tidak ada alasan untuk menggunakan Objects.isNull(object)lebih object == nulldalam jika pernyataan . Berikut dua varian berdampingan:

if (object == null) {
}

if (Objects.isNull(object)) {
}

Haruskah Objects.isNull () dibatasi pada Predicates secara eksklusif?

Bisa dibilang ya, itu terbatas pada Predikat saja, meski tidak ada kendala teknis untuk digunakan di Objects.isNull()mana - mana.

Dari public static boolean isNull(Object obj)metode javadoc:

@apiNote Metode ini ada untuk digunakan sebagai java.util.function.Predicate, filter (Objects :: isNull)

Jadi jika Anda menggunakan metode ini sebagai bukan predikat, Anda sebenarnya menggunakan ekspresi yang lebih kompleks dan tidak praktis dibandingkan dengan yang sederhana object == null.

Berikut ini cuplikan untuk membandingkan manfaat Objects.isNull(object)

List<String> list = Arrays.asList("a", "b", null, "c", null);

// As ready-made predicate
long countNullsWithPredicate = list.stream().filter(Objects::isNull).count();

// Lambda
long countNullsWithLambda = list.stream().filter(object -> object == null).count();

// Reimplement the Objects::isNull predicate
long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() {
    @Override
    public boolean test(Object obj) {
        return obj == null;
    }
}).count();
Vasil
sumber
2

Secara semantik tidak ada perbedaan tetapi untuk keterbacaan saya lebih suka yang berikut ini whatever == null:

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
angry_snyder
sumber