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")
)

它有点冗长,但如果 criteriaIdentifiernull(不需要额外的依赖项),将允许您默认为 -1l

APIhere and here

当我们说 nullSafe 时,我们通常希望在通过 null 时从 api 接收 null,而不是 0-1或任何其他值。

为此,使用 org.apache.commons.lang3.math.NumberUtilscreateLong 静态方法。

原因*: 如果输入字符串不是 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)