Возвращает ноль не является грязным само по себе .Иногда можно злоупотреблять использованием нулей, но это вполне допустимый вариант использования нуля.Kotlin позволяет вам использовать null безопасным и приятным способом, так что не бойтесь его использовать!
Другой вариант - вызвать исключение также в том случае, если вы показываете диалоговое окно (независимо от того, есть ли заголовок или нет).присутствует).
Чтобы выбрать, вам нужно спросить себя, что будет делать код, вызывающий rest()
, если появится диалоговое окно. имеет , чтобы так или иначе иметь дело с отсутствием T
(ноль или исключение).Это связано с тем, что показ диалога не является чем-то, что прекращает выполнение вашей функции.
И последнее, но не менее важное, есть также возможность работать с результатом вне метода rest()
.Улучшение в ответе Тараса:
sealed class Result<out T : Any> {
class Success<out T : Any>(val value: T) : Result<T>()
class ErrorWithId(val exception: Exception, val requestId: String) : Result<Nothing>()
class Error(val exception: Exception) : Result<Nothing>()
}
inline fun <T : Any> rest(request: () -> T): Result<T> = try {
Result.Success(request())
} catch (e: HttpException) {
val requestId = e.response().raw().request().header(REQUEST_ID_HEADER)
if (requestId != null) {
Result.RecoverableError(e, requestId)
} else {
Result.Error(e)
}
}
private fun thingCallingRest() {
val result = rest(::testRequest)
when (result) {
is Result.Success -> Log.v("__DEBUG", "success: ${result.value}")
is Result.ErrorWithId -> Dialog(result.requestId, R.string.oops).show(fragmentManager, null)
is Result.Error -> throw result.exception
}
}