Nullsafe Long valueOf
Nullsafe Long valueOf
想象一下下面的场景
Long critId = Long.valueOf(criteriaIdentifier);
如果最初加载视图 criteriaIdentifier
可能为空,之后我根据 JSF 视图中的 selectedItem
设置值。
但是,Long.valueOf(criteriaIdentifier)
抛出一个 NumberFormatException
- 如果字符串不能被解析为 long(即 null
)。
我想过将 Id 默认设置为默认 -1
,但我想知道是否有更好的做法。
PS:从技术上讲,criteriaIdentifier
不能是 -1,因为这些值是从数据库中使用序列生成器设置的,所以我应该知道 -1是默认值并正确执行默认操作
您可以使用 Apache Commons 中的 NumberUtils
。它是 null 安全的,您可以选择指定默认值。
示例:
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。
我假设 criteriaIdentifier 是一个字符串。
你可以使用
org.apache.commons.lang3.math.NumberUtils.toLong(String, long) 如果 String 参数为 null,它会为您提供默认值。
或者,如果字符串为空,则使用 org.apache.commons.lang3.math.NumberUtils.toLong(String) 其中 returns 为零。
这取决于您的场景,但通常有办法避免此类问题。
通常将 ID 设置为 -1 是一种常见的做法,但我认为这不是一个好做法。您知道 -1 在您的场景中不是可能的值,但仅考虑 Long 类型它是一个有效值。所以在代码的任何地方你都需要实现像 if id!=-1
这样的测试,这使得代码更难理解,通常 null
值更适合这种情况 - 没有值的长对象。
如果由我决定,例如在接收 ID 并等待有效 ID(如果我得到 null)的方法中,我将抛出异常并让方法的调用者处理该异常。例如,如果它是一个网络 API(否则你为什么会得到一个字符串?)那么你可以抛出一个 HTTP 错误。或者如果你想处理错误的参数,那么你最好 return null 或使用 null 作为默认值。
Long.valueOf(null)
将抛出 NumberFormatException
,而不是 NullPointerException
。
在 Java 8 中,您可以声明性地为可为空的内联选择默认评估,例如
Long.valueOf(
Optional.ofNullable(criteriaIdentifier).orElseGet(() -> "-1")
)
它有点冗长,但如果 criteriaIdentifier
是 null
(不需要额外的依赖项),将允许您默认为 -1l
。
当我们说 nullSafe 时,我们通常希望在通过 null
时从 api 接收 null
,而不是 0
或 -1
或任何其他值。
为此,使用 org.apache.commons.lang3.math.NumberUtils
的 createLong
静态方法。
原因*:
如果输入字符串不是 null
并且不是数字,则会抛出 NumberFormatException。
注意**:从 3.1 开始,它处理十六进制 (0Xhhhh) 和八进制 (0ddd) 符号。 N.B。前导零表示八进制;空格未被修剪。
样本:
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)
想象一下下面的场景
Long critId = Long.valueOf(criteriaIdentifier);
如果最初加载视图 criteriaIdentifier
可能为空,之后我根据 JSF 视图中的 selectedItem
设置值。
但是,Long.valueOf(criteriaIdentifier)
抛出一个 NumberFormatException
- 如果字符串不能被解析为 long(即 null
)。
我想过将 Id 默认设置为默认 -1
,但我想知道是否有更好的做法。
PS:从技术上讲,criteriaIdentifier
不能是 -1,因为这些值是从数据库中使用序列生成器设置的,所以我应该知道 -1是默认值并正确执行默认操作
您可以使用 Apache Commons 中的 NumberUtils
。它是 null 安全的,您可以选择指定默认值。
示例:
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。
我假设 criteriaIdentifier 是一个字符串。 你可以使用 org.apache.commons.lang3.math.NumberUtils.toLong(String, long) 如果 String 参数为 null,它会为您提供默认值。 或者,如果字符串为空,则使用 org.apache.commons.lang3.math.NumberUtils.toLong(String) 其中 returns 为零。
这取决于您的场景,但通常有办法避免此类问题。
通常将 ID 设置为 -1 是一种常见的做法,但我认为这不是一个好做法。您知道 -1 在您的场景中不是可能的值,但仅考虑 Long 类型它是一个有效值。所以在代码的任何地方你都需要实现像 if id!=-1
这样的测试,这使得代码更难理解,通常 null
值更适合这种情况 - 没有值的长对象。
如果由我决定,例如在接收 ID 并等待有效 ID(如果我得到 null)的方法中,我将抛出异常并让方法的调用者处理该异常。例如,如果它是一个网络 API(否则你为什么会得到一个字符串?)那么你可以抛出一个 HTTP 错误。或者如果你想处理错误的参数,那么你最好 return null 或使用 null 作为默认值。
Long.valueOf(null)
将抛出 NumberFormatException
,而不是 NullPointerException
。
在 Java 8 中,您可以声明性地为可为空的内联选择默认评估,例如
Long.valueOf(
Optional.ofNullable(criteriaIdentifier).orElseGet(() -> "-1")
)
它有点冗长,但如果 criteriaIdentifier
是 null
(不需要额外的依赖项),将允许您默认为 -1l
。
当我们说 nullSafe 时,我们通常希望在通过 null
时从 api 接收 null
,而不是 0
或 -1
或任何其他值。
为此,使用 org.apache.commons.lang3.math.NumberUtils
的 createLong
静态方法。
原因*:
如果输入字符串不是 null
并且不是数字,则会抛出 NumberFormatException。
注意**:从 3.1 开始,它处理十六进制 (0Xhhhh) 和八进制 (0ddd) 符号。 N.B。前导零表示八进制;空格未被修剪。
样本:
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)