簡體   English   中英

Nullsafe Long valueOf

[英]Nullsafe Long valueOf

想象以下場景Long critId = Long.valueOf(criteriaIdentifier);

如果視圖最初加載, criteriaIdentifier可能為空,之后我根據 JSF 視圖中的selectedItem設置值。

但是, Long.valueOf(criteriaIdentifier)拋出NumberFormatException - 如果字符串不能被解析為 long(即null )。

我想過將 Id 默認設置為 default -1 ,但我想知道是否有更好的做法。

PS:從技術上講, criteriaIdentifier不能是 -1,因為這些值是從數據庫中設置的,使用序列生成器,所以我應該知道 -1 是默認值並正確執行默認操作

您可以使用 Apache Commons 中的NumberUtils 它是空安全的,您可以選擇指定默認值。

示例:

NumberUtils.toLong(null) = 0L
NumberUtils.toLong("")   = 0L
NumberUtils.toLong("1")  = 1L

NumberUtils.toLong(null, 1L) = 1L
NumberUtils.toLong("", 1L)   = 1L
NumberUtils.toLong("1", 0L)  = 1L

有關更多信息,請查看API

Long.valueOf(null)將拋出NumberFormatException ,而不是NullPointerException

在 Java 8 中,您可以聲明性地為可空內聯選擇默認評估,例如

Long.valueOf(
    Optional.ofNullable(criteriaIdentifier).orElseGet(() -> "-1")
)

它有點冗長,但如果criteriaIdentifiernull ,則允許您默認為-1l (不需要額外的依賴項)。

API 在這里這里

我假設criteriaIdentifier 是一個字符串。 您可以使用org.apache.commons.lang3.math.NumberUtils.toLong(String, long)如果 String 參數為空它會為您提供默認值。 或者您使用org.apache.commons.lang3.math.NumberUtils.toLong(String)如果字符串為空則返回零。

這取決於您的情況,但通常有辦法避免此類問題。

通常將 ID 設置為 -1 是一種常見做法,但我認為這不是一個好的做法。 您知道 -1 在您的場景中不是一個可能的值,但僅考慮 Long 類型,它是一個有效值。 所以在代碼中的任何地方你都需要實現像 if id!=-1這樣的測試,這使得代碼更難理解,通常null值更適合這種情況 - 沒有值的長對象。

如果這取決於我,例如在接收 ID 並等待有效 ID 的方法中,如果我得到 null,我會拋出異常並讓方法的調用者處理它。 例如,如果它是一個 Web API(否則為什么你會得到一個字符串?)那么你可以拋出一個 HTTP 錯誤。 或者,如果您想處理錯誤的參數,則最好返回 null 或使用 null 作為默認值。

當我們說 nullSafe 時,我們通常希望在通過它傳遞null時從 api 接收一個null ,而不是0-1或任何其他值。

為此,請使用org.apache.commons.lang3.math.NumberUtils createLong靜態方法。

CAUSION*:如果輸入字符串不為null且不是數字,則拋出 NumberFormatException。

小心**:從 3.1 開始,它處理十六進制 (0Xhhhh) 和八進制 (0ddd) 符號。 NB 前導零表示八進制; 沒有修剪空格。

樣品:

NumberUtils.createLong(null) --> null
NumberUtils.createLong("1") --> 1
NumberUtils.createLong("hi") --> NumberFormatException
NumberUtils.createLong(" 11") --> NumberFormatException (does not trim)
NumberUtils.createLong("023") --> 19 (leading 0 means octal)
NumberUtils.createLong("0x23") --> 35 (leading 0x means hex)

暫無
暫無

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

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