簡體   English   中英

Java 中的“Boolean.TRUE.equals(x)”有什么原因嗎?

[英]Is there any reason for "Boolean.TRUE.equals(x)" in Java?

我在我正在從事的項目之一中遇到過這段代碼

(這是在Java中)

if (Boolean.TRUE.equals(foo.isBar()))

Foo#isBar()被定義為boolean isBar() ,所以它不能返回null

真的有什么理由應該這樣寫嗎? 我自己會寫

if (foo.isBar())

,但也許我遺漏了一些微妙的東西。

謝謝

我希望foo.isBar()返回一個布爾值。 在這種情況下,您總是可以寫if (foo.isBar()) 如果foo.isBar()返回Boolean則它可以是Boolean.TRUEBoolean.FALSENULL 在這種情況下, if (Boolean.TRUE.equals(foo.isBar()))確保if塊在一個場景中執行(TRUE)並在剩余2中省略。

超過 if (foo.isBar()) 將失敗,當 foo.isBar() 返回Boolean NULL時。

由於isBar返回一個原始boolean ,因此沒有語義差異。 此外,第二種方式更簡潔,更清晰,更有效,因為結果不必為調用自動裝箱,然后再次提取原始布爾值。 鑒於這一切,沒有理由使用第一種方法,而有幾種方法使用第二種方法,所以使用第二種方法。 我給其他編碼人員留下了很大的余地,但我會坐下來與任何向專業代碼添加類似內容的人聊聊。

我懷疑“舊遺留代碼沒有充分理由” - 事實上,我認為情況更糟 (我想知道如何比較int ..)

使用TRUE.equals的代碼需要一個拳擊轉換,一個額外的方法調用(以及里面的所有內容),最后,它看起來很草率


我所知道的唯一原因是foo.isBar 輸入為返回Boolean (不是boolean )並且它可能返回null

Boolean b = null;

// throws an exception when it tries to unbox b because it is null
boolean isTrue1 = (boolean)b;

// evaluates to false
boolean isTrue2 = Boolean.TRUE.equals(b);

// evaluates to false as well
boolean isTrue3 = b != null ? (boolean)b : false;

有些人認為(我自己不是其中之一)過於明確使得布爾條件更具可讀性。 例如使用

if(foo == true)而不是if(foo)

也許這是一個類似的案例?

我是否發現這個實際示例對某人有用:

當裝箱類型 java.lang.Boolean 用作表達式時,如果該值為Java Language Specification §5.1.8 Unboxing Conversion 中定義的null ,它將拋出NullPointerException

完全避免這種轉換並顯式處理空值會更安全。

不合規的代碼示例

Boolean b = getBoolean();
if (b) {  // Noncompliant, it will throw NPE when b == null
  foo();
} else {
  bar();
}

合規解決方案

Boolean b = getBoolean();
if (Boolean.TRUE.equals(b)) {
  foo();
} else {
  bar();  // will be invoked for both b == false and b == null
}

在第一個條件中,您正在檢查對應於true的Boolean對象是否相等。 並且您正在使用代碼中的第一個條件,因為您的Java版本不支持自動裝箱,因此您需要使用布爾對象。

Java中的Boolean.TRUE和true有什么區別?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM