kotlin 获取可为null的属性或引发异常

fjaof16o  于 2023-01-05  发布在  Kotlin
关注(0)|答案(4)|浏览(202)

我最近从java转换到了Kotlin。我的代码中有下面的方法,我想问一下是否有更好的方法来用kotlin写它?
这是我的解析方法,从对象obj解析id,该对象具有可空属性nullableNestedObject,并且该对象具有id属性。

fun parseId(obj: WrappingObject): Long {
    val myId = obj.nullableNestedObject?.myId

    if (myId === null) {
        logger.error("Id not found because of ...")
        throw InternalException("Id not found")
    }
    return myId
}
6ojccjat

6ojccjat1#

您可以通过将相关代码放入run()调用中来稍微简化它:

fun parseId(obj: WrappingObject): Long
    = obj.nullableNestedObject?.myId
        ?: run {
            logger.error("ID not found because of...")
            throw InternalException("ID not found")
        }

Run是一个scoping function,它提供了一种将代码行分组到一个块中的简单方法。
(If块没有抛出异常,当然它也必须返回一个Long值。)
你会注意到我把它变成了一个单表达式函数--它更短了,也更容易看到它返回了什么 (不过,这只适用于相当短的函数)。
(我还将“ID”大写,这是我的一个问题:这是一个缩写,发音为两个字母,所以两个字母都应该大写, 否则,它看起来就像精神分析中的术语......)
您可能考虑的另一个更改是使其成为WrappingObject上的扩展函数:

fun WrappingObject.parseId(): Long
    = nullableNestedObject?.myId
        ?: run {
            logger.error("ID not found because of...")
            throw InternalException("ID not found")
        }

这样,就可以将其称为myWrappingObject.parseId(),就好像它是WrappingObject的一个方法一样, 这样可以使名称空间更清晰一些,并让您的IDE提供建议。
根据Tulip的回答,如果您不需要调用日志记录器,这将更加简单:

fun parseId(obj: WrappingObject): Long
    = obj.nullableNestedObject?.myId
        ?: throw InternalException("ID not found")

当我编写自定义异常时,我倾向于在构造函数中编写日志条目,这样既可以实现简单性,又可以避免重复的日志调用。

nhjlsmyf

nhjlsmyf2#

如果长整型值可以为空,则可以使用这种方式,并在以后检查空值或非空值

fun parseId(obj: WrappingObject): Long? {
    return obj.nullableNestedObject?.myId
}
ddarikpa

ddarikpa3#

如果您正在寻找简洁(即最小)的代码,我建议使用elvis操作符(?:)和run scope函数:

fun parseId(obj: WrappingObject): Long = obj.nullableNestedObject?.myId ?: run {
        logger.error("Id not found because of ...")
        throw InternalException("Id not found")
    }
nom7f22z

nom7f22z4#

这只是同一主题的另一个变体,只是因为我发现作用域函数和括号有时会使代码不那么简单

fun WrappingObject.parseId() = nullableNestedObject?.myId ?: logAndThrow()

private fun logAndThrow() {
    logger.error("ID not found because of...")
    throw InternalException("ID not found")
}

相关问题