Kotlin возвращает нулевое безопасное значение из нулевого значения - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть эта функция

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 ]

2 голосов
/ 18 апреля 2020

Kotlin уже дает вам инструменты для работы с обнуляемыми типами. Я бы просто использовал функции видимости и / или оператор elvis. В вашем конкретном случае c достаточно оператора elvis.

class SomeType(val someOtherType: SomeOtherType?) {
  fun doSomeDamage(): SomeThirdType {
    //some work
    return SomeThirdType(someOtherType ?: error("someOtherType should not be null"))
  }
}
0 голосов
/ 18 апреля 2020

«Пользователь» класса SomeType не будет ожидать cra sh при простом вызове функции doSomeDamage(). SomeType полностью построен, и все же doSomeDamage вероятно будет иметь sh.
Я лично предпочитаю:

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

или если SomeOtherType действительно действительно принадлежит SomeType (чего я не чувствую):

fun doSomeDamage(): SomeThirdType? = someOtherType?.let{...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...