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


92

Bildiğiniz gibi, java.util.Objectsbir

Bu sınıf, nesneler üzerinde çalışmak için statik fayda yöntemlerinden oluşur.

Bu tür yöntemlerden biri Objects.isNull() .

Anladığım kadarıyla, Objects.isNull()saniyeyi atlayarak yanlışlıkla nesneye boş bir değer atama olasılığını ortadan kaldırır =.

Ancak API Notu şunları belirtir:

Bu yöntem bir Dayanak, filtre (Objects :: isNull) olarak kullanılmak üzere mevcuttur.

Kullanmalıyım hangi bir neden / durum var olur object == nullaşkın Objects.isNull()bir in ise ifadesi ?

Objects.isNull()Yalnızca Predicates ile sınırlı mı olmalı ?


4
Endişelendiğiniz tek şey yanlışlıkla atama ise, if(null == variable)tutarlı bir şekilde kullanabilirsiniz …
Holger

1
@Holder, endişelenecek ne tür bir görev var? Bu Java. Bir tür hatası alacaksınız.
Louis Wasserman

1
@LouisWasserman Değilse variablebir Boolean.
Alexis C.

2
@AlexisC, bu bir endişe olurdu minik, minik dava sayısına: En değişken çok spesifik tip olmak zorunda, ve çok spesifik bir yazım hatası yapmak zorunda, ve herhangi bir IDE veya derleyici analizi kullanılarak edilemez bu sizin için bunu gösterir (neredeyse tüm IDE'lerin yapacağı gibi). Bu dava için endişelenmemek oldukça rahat.
Louis Wasserman

1
İş yerinde, null == nesnesinin birçok örneğini gördüm . Sorduğumda, yanlışlıkla boş atamaları önlemek için olduğu söylendi. Burada verilen yorum ve cevaplara dayanarak, bunun bir zevk meselesi olduğuna inanmaya meyilliyim.
Lucas T

Yanıtlar:


82

if ifadesinde Object == null over Objects.isNull () kullanmalı mı?

Eğer bakarsanız kaynak kodunun ait IsNullyönteme,

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

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

Bu aynı. Fark yok. Böylece güvenle kullanabilirsiniz.


14
Evet, kullanılabilir, ancak bir araç tarafından gerçekleştirilen yerel akış analizine müdahale edebilir. Yani, düz bir "==" ile, herhangi bir akış analizi, referansın o zaman dalda iyi olmadığını, ancak başka bir dalda güvenli olduğunu görebilir. Uygun hataları / uyarıları alırsınız veya hiçbir şey almazsınız. İsNull () çağrısının dolaylanmasıyla, bu bilgi araç tarafından kaybedilebilir.
Stephan Herrmann

3
Küçük bir performans farkı var. Java'nın nesne boş başvurusunu denetlemesi ile statik bir yöntemi çağırma arasında bir fark olacaktır. Ve hepimizin alıştığı == kullanmaktan biraz daha az net okur.
Kevin M

3
Daha anlamsal kullanımı mı == nulliçinde if, ama ısnull lambda ifadeleri kullanmak harika.
Leonardo Ramos Duarte

1
kesinlikle meşru, ancak operatörlere göre herhangi bir faydası yok. Bu nedenle, bir takımda çalışıyorsanız, lütfen nesneleri amaçlarına göre kullanın.
Alex Panchenko

78

Objects.isNull Java 8 lambda filtrelemede kullanılmak üzere tasarlanmıştır.

Yazması çok daha kolay ve anlaşılır:

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

yazmaktan daha çok:

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

İçinde ifAncak açıklama , ikisi de işe yarayacaktır. Kullanımının == nullokunması muhtemelen daha kolaydır, ancak sonunda bir stil tercihi haline gelecektir.


Yazmanın "çok daha kolay / anlaşılır" olduğu iddiasına katılmıyorum. 1. Daha kısa değil. 2. Özellikle en son Java sözdizimine aşina olmayanlar için açıkça daha az ifade edicidir. Günlük olarak Java yazmayan biri olarak benim için (Scala yazıyorum), boşluğu kontrol etmekten başka hiçbir şey yapmayan statik bir yönteme sahip olmak, halüsinasyon hissi veriyor. Bu yöntem, herhangi bir fayda eklenmeden akıcı kod okumadan sadece bir sapmadır.
Eli Golin

12

Kaynağa bak:

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

nullDeğerleri kontrol etmek için şunları kullanabilirsiniz:

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

S Objects.isNulliçin kastedilen gerçek Predicateonu yukarıdaki gibi kullanmanızı engellemez.


1
Yazım hatası riski ile neyi kastediyorsunuz?
Ashish Lohia

2
@AshishLohia =yerine kullanarak ==(null yapılabilir bir Booleansarmalayıcı değilse derlemez , adil olun)
Mena

5
Yazım hatası riski, (myObject = null) derleme hatasıyla sonuçlanacaksa, Java'da olmayan C ++ 'daki sorundur. Her zaman myObject == null over null == myObject kullanmalısınız.
Tomas Marik

1
@TomasMarik yorumumda da belirtildiği gibi, yazım hatası riski BooleanJava'daki null yapılabilir sarmalayıcılarla sınırlıdır . Bu oldukça nadirdir (ve bir atama bir koşulmuş nullgibi kontrol edildiğinde derleyiciye uyarı verir ), ancak imkansız değildir.
Mena

7

Bir if ifadesinde Object == null over Objects.isNull () kullanmam gereken herhangi bir neden / durum var mı?

Evet, bir neden kodu basit tutmaktır. İf ifadesi object == null açık ve iyi biliniyor. Örneğin bir yazım hatası varsa, herhangi bir yanlış davranışa yol açamaz.

Anladığım kadarıyla, Objects.isNull (), ikinci = 'yi atlayarak yanlışlıkla nesneye boş bir değer atama olasılığını ortadan kaldıracaktır.

Varsa bir if (object = null) {}ile ihmal = derlenemeyecektir.Ancak etmez veya durumunda uyarısı oluşturur Booleannesne! Aslında if ifadesinin içinde Objects.isNull(object)over kullanmak için bir neden yok . İşte yan yana iki varyant:object == null

if (object == null) {
}

if (Objects.isNull(object)) {
}

Objects.isNull () yalnızca Predicates ile sınırlı mı olmalı?

Evet denilebilir, Objects.isNull()her yerde kullanmak için teknik bir engel olmamasına rağmen, yalnızca Predicates ile sınırlıdır .

Gönderen public static boolean isNull(Object obj)yöntemin javadoc:

@apiNote Bu yöntem java.util.function.Predicate, filtre (Objects :: isNull) olarak kullanılmak üzere mevcuttur.

Siz yöntemi kullanmak Yani eğer değil bir yüklemi aslında basit oranla daha karmaşık ve hantal ifadesini kullanıyor object == null.

İşte avantajlarını karşılaştırmak için bir pasaj 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();

2

Anlamsal olarak bir fark yoktur, ancak okunabilirlik için aşağıdakileri tercih ederim whatever == null:

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.