簡體   English   中英

如何安全地處理Java的包裝原語

[英]How to safely handle Java's wrapped primitives

我正在編寫一個程序,該程序需要處理帶有許多包裝數字變量(例如Long,Double,Integer等)的對象。如何安全地對這些變量執行數字運算而不必到處都進行空檢查?

我希望這幾乎是每個Java程序員遲早都必須處理的事情,所以令我感到驚訝的是,沒有數百篇有關該主題的博客文章和此類問題。

我當前的解決方案是通過如下方法過濾所有數字:

private static safelyUnbox(Integer i) {
    return i == null ? 0 : i.intValue();
}
...
sumVariable += safelyUnbox(stupidObject.getNumberOfWhatever());

Java 8為檢查null提供了很好的選擇。 例如,如果一個Integer可能有或沒有值,則可以將其聲明為Optional<Integer> Optional類具有大量有用的實用程序,用於返回默認值,引發異常,檢查值是否存在等。

聲明Optional<Integer>的好處是,您向讀者清楚地表明“無值”是合法狀態。 維護您的代碼的任何人別無選擇,只能使用Optional方法來決定值存在或不存在時發生的情況。

另一方面,如果該參數是強制性的,那么最簡單的選擇就是在使用該參數之前斷言該參數不為null。

(在我看來)在可能不存在任何值的情況下使用Optional的最大好處是,您可以基於null始終是錯誤的假設開始依賴代碼。

Optional甚至提供了一個潛在的空變量轉換成一個整齊的方式Optional (例如,如果它傳遞給你,你必須在其上的項值的代碼無法控制)。 它是這樣的:

Optional<Integer> optVal = Optional.ofNullable(val);

然后,可以像使用其他任何Optional一樣使用新變量。 例如:

optVal.ifPresent(myList::add);

要么:

return optVal.orElse(27);

您有一個非常具體的問題,並且試圖不考慮它而將其概括化。

  • 可能前提是空值無效。 就您而言,您在評論中指出並非如此。 但是,如果是這樣,您應該處理而不是隱藏它。

  • “安全”值可能會有所不同。 您選擇0是因為要累加數字,如果要相乘(或將其用作商)會怎樣? 這是您的safelyUnbox方法不具備的知識。

避免概括一切。 對於您來說,最好的代碼很簡單:

for(Integer integ : myCollection) {
  if (integ != null) {
    sum += integ;
  }
}

其他所有情況都有其自己的,最適當的解決方案。 比較一下

for(Integer integ : myCollection) {
  sum += safeUnboxThatDefaultsto0(integ);
}

要么

for(Integer integ : myCollection) {
  sum += safeUnbox(integ, 0);
}

通過使用該方法,您將獲得什么收益?

您可以使用Google的Guava庫使用並避免使用null

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

Optional的最大優點不是readability :優點是其防白痴。 如果您要完全編譯程序,它會迫使您積極考慮不存在的情況,因為您必須主動展開Optional並解決該情況。 Null使得簡單地忘記事物變得異常容易。

假設這種情況:

String meterReading=getValueFromRemoteSite();
System.out.println(meterReading.toLowerCase()); //Chances for NPE

但是使用可選方案是不同的

Optional meterReading = Optional.of(getValueFromRemoteSite(););
if( meterReading.isPresent() )
{
   System.out.println( meterReading.get() );
}  

暫無
暫無

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

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