2016-06-22 169 views
19

如你所知,java.util.Objectsjava.util.Objects.isNull VS對象== NULL

有關對象

這種方法之一是Objects.isNull工作的實用方法() 。

我的理解是,Objects.isNull()將通過省略第二個=刪除意外地將空值分配給對象的機會。

然而,API注狀態:

這種方法存在着用作謂詞,過濾器(對象::的isNull)

會不會有任何理由/環境爲此,我應該在if語句上使用Objects == null對象Object.isNull()

Objects.isNull()僅限於Predicates?

由於提前, 盧卡斯

+0

there's Objects.requireNonNull(T obj); btw –

+1

如果你所擔心的只是偶然的分配,你可以簡單地使用'if(null == variable)'... – Holger

+1

@Holder,你有什麼意外的擔心嗎?這是Java。你會得到一個類型錯誤。 –

回答

18

應在使用if語句對象== NULL超過Objects.isNull()?

如果你看一下IsNull方法source code

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

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

這是一樣的。沒有區別。所以你可以安全地使用它。

+1

是的,可以使用,但可能會干擾工具執行的局部流量分析。即,用一個普通的「==」表示,任何流分析都可以看到,當時分支中的解引用不好,但在其他分支中是安全的。你會得到適當的錯誤/警告或什麼都沒有。隨着調用isNull()的間接性,知識可能會丟失到工具中。 –

9

看看源:

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

要檢查null值,你可以使用:

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

Objects.isNull用於Predicate的事實並不妨礙您像上面那樣使用它。

+1

你是什麼意思的錯字的風險? –

+1

@AshishLohia通過使用'='而不是'=='(不會編譯,除非它是一個可爲空的'布爾'包裝,是公平的) – Mena

+0

感謝您的清除。 –

1

會不會有任何理由/情形爲此我應該在if語句使用對象== NULL超過Objects.isNull()?

是的,一個原因是保持代碼簡單。在之內如果陳述object == null是清楚和衆所周知的。如果存在拼寫錯誤,它不會導致任何不當行爲。

我的理解是Objects.isNull()會通過省略second =來消除意外地將null值分配給對象的機會。

如果有if (object = null) {}省略=它不會編譯或將在Boolean對象的情況下產生的警告!其實沒有理由使用Objects.isNull(object)而不是object == null如果聲明。這裏有兩個變種並排:

if (object == null) { 
} 

if (Objects.isNull(object)) { 
} 

是否應Objects.isNull()僅限於專門的謂詞?

可以說是的,它僅限於Predicates,儘管在任何地方都沒有技術障礙使用Objects.isNull()

public static boolean isNull(Object obj)方法的Javadoc:

@apiNoteThis方法存在被用作java.util.function.Predicate,過濾器(對象::參考isNull)

所以如果你使用該方法爲而不是謂詞實際上與簡單的object == null相比,您使用的表達式更加複雜和繁瑣。

這裏是一個片段比較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(); 
4

Objects.isNull的好處是針對Java 8拉姆達過濾中使用。

它更容易和更清晰的寫

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

比寫

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

在if然而無論是將工作,使用== NULL的可能是更容易閱讀,但在結束它將歸結爲一種風格偏好。