Я хотел бы знать, есть ли более идиоматический способ написать следующее в Kotlin:
private var loadingFlag: Boolean = false
override fun onResume() {
super.onResume()
if (!loadingFlag) {
// do something
loadingFlag = true
}
}
пока самое близкое, что я мог придумать, это:
val lazyValue: Unit by lazy {
println("computed!")
Unit
}
fun main() {
println(lazyValue)
println(lazyValue)
}
который выполняет println("computed!")
только один раз, как и ожидалось.
По сути, когда я вызываю код, я хочу, чтобы println("computed!")
вызывался только один раз, а последующие вызовы ничего не делали. Есть идеи?
почему вы не используете синглтон?
На самом деле код выполняется только один раз. Затем вы печатаете только сохраненное значение. В чем здесь твоя проблема?
Прошу прощения, возможно, мой вопрос был недостаточно ясен, поэтому я обновил его.
@ bvk256 Мне кажется, что использование lazy
здесь хорошо подходит и совершенно идиоматично Kotlin.
@marstran да, я вижу, что можно опустить «Unit» в коде и уместить его в 3 строки, спасибо
Я бы не считал идиоматичным иметь свойство со значением Unit или вызывать свойство для его побочного эффекта. Это оба запаха кода.
Вы можете написать собственный геттер для логического свойства, чтобы оно всегда возвращало false после первого извлечения. Его можно сбросить, установив для него значение true.
var firstTime: Boolean = true
get() = field.also { field = false }
Это просто удобство. В вашем первом блоке кода нет ничего неидиоматического.
Почему это не идиоматично? Выглядит отлично для меня.