Kotlin从可空值返回空安全值

时间:2020-04-18 14:56:43

标签: kotlin

我有这个功能

fun <T> safe(t: T?): T {
    return Optional.ofNullable(t).orElseThrow { IllegalStateException("safe value should not be null") }
}

我用它来表示我知道T现在不为空,所以把它的不可为空的形式还给我。

所以我这样声明,

class SomeType(val someOtherType: SomeOtherType?)

但是在其他地方的一些someOtherType则这样声明:

class SomeThirdType(val someOtherType: SomeOtherType)

因此在SomeType中,我具有以下功能:

class SomeType(val someOtherType: SomeOtherType?) {
  fun doSomeDamage(): SomeThirdType {
    //some work
    return SomeThirdType(safe(someOtherType))
  }
}

我对safe函数不满意,有更好的方法吗?我觉得这里缺少基本的东西

2 个答案:

答案 0 :(得分:2)

Kotlin已经为您提供了用于可空类型的工具。我只会使用范围函数和/或Elvis运算符。在您的特定情况下,elvis运算符似乎足够。

class SomeType(val someOtherType: SomeOtherType?) {
  fun doSomeDamage(): SomeThirdType {
    //some work
    return SomeThirdType(someOtherType ?: error("someOtherType should not be null"))
  }
}

答案 1 :(得分:0)

SomeType类的“用户”不会期望通过简单的doSomeDamage()函数调用而崩溃。 SomeType已完全构建,但doSomeDamage可能会崩溃。
我个人更喜欢:

fun doSomeDamage(someOtherType: SomeOtherType): SomeThirdType // with no-arg constructor

或者如果SomeOtherType 确实确实属于SomeType(我觉得不属于):

fun doSomeDamage(): SomeThirdType? = someOtherType?.let{...}