Почему я должен возвращать Unit.INSTANCE в void kotlin функции, когда вызывается из Java, а не NULL? - PullRequest
3 голосов
/ 17 февраля 2020

При наличии функции, например:

fun doSomething(action:() -> Unit) {
   action.invoke()
}

если я вызываю это с Java, код должен быть:

doSomething(() -> {
   //do something
   return Unit.INSTANCE
})

Я видел код вместо этого с использованием

doSomething(() -> {
   //do something
   return null
})

Влияет ли это на отправку null вместо Unit.INSTANCE? Kotlin выполняет больше вещей, проверяя, что вместо этого возвращается экземпляр UNIT?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2020

Я думаю, что в большинстве случаев не имеет значения, используется ли null или Unit.INSTANCE. Однако, поскольку есть хотя бы один случай, когда такой null нежелателен, вам, вероятно, следует всегда использовать Unit.INSTANCE затем.

Один из таких выдуманных примеров, в которых невозвращение Unit.INSTANCE вызовет проблему выглядит следующим образом:

fun doSomething(action:() -> Unit) {
   action.invoke() logReturnTime("after action invocation")
}
infix fun Unit.logReturnTime(msg : String) { TODO("logging return time $msg") }

Если вы вызовете это и вернете null, вы получите IllegalArgumentException, тогда как код будет работать без проблем, если вы используете Unit.INSTANCE.

* 1015 С учетом вышесказанного, я не верю, что это хороший пример, но он ясно показывает, что если кто-то оперирует с этим Unit, то он может потерпеть неудачу, поэтому вам, вероятно, лучше всегда использовать Unit.INSTANCE и вы в безопасности, независимо от того, о том, что приемник делает с вашей функцией.
2 голосов
/ 17 февраля 2020

Любой метод в Kotlin возвращает значение. Методы void всегда возвращают один экземпляр типа Unit, равный Unit.INSTANCE. Вы можете принять единицу возвращаемого типа в объявлении, но неявно она добавляется, и значение возвращается в конце метода. https://kotlinlang.org/docs/reference/basic-syntax.html

Поэтому при вызове метода Kotlin из кода Java необходимо выполнить тот же контракт и вернуть что-то. Если вы вернете null, это пустая ссылка на тип Unit. Просто потому, что лучше избегать нулевых ссылок, в случае, если вызывающая сторона желает воздействовать на результат вашего метода, вы должны избегать возврата null и возврата Unit.INSTANCE. Да, этот случай маловероятен, но вызовет самую досадную ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...