Инициализируйте свойство в Kotlin, чтобы код выполнялся только один раз

Я хотел бы знать, есть ли более идиоматический способ написать следующее в 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!") вызывался только один раз, а последующие вызовы ничего не делали. Есть идеи?

Почему это не идиоматично? Выглядит отлично для меня.

marstran 14.12.2020 14:32

почему вы не используете синглтон?

Prabudda Fernando 14.12.2020 14:36

На самом деле код выполняется только один раз. Затем вы печатаете только сохраненное значение. В чем здесь твоя проблема?

Lenin 14.12.2020 14:38

Прошу прощения, возможно, мой вопрос был недостаточно ясен, поэтому я обновил его.

bvk256 14.12.2020 14:44

@ bvk256 Мне кажется, что использование lazy здесь хорошо подходит и совершенно идиоматично Kotlin.

marstran 14.12.2020 14:57

@marstran да, я вижу, что можно опустить «Unit» в коде и уместить его в 3 строки, спасибо

bvk256 14.12.2020 15:01
0
6
494
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы не считал идиоматичным иметь свойство со значением Unit или вызывать свойство для его побочного эффекта. Это оба запаха кода.

Вы можете написать собственный геттер для логического свойства, чтобы оно всегда возвращало false после первого извлечения. Его можно сбросить, установив для него значение true.

var firstTime: Boolean = true
    get() = field.also { field = false }

Это просто удобство. В вашем первом блоке кода нет ничего неидиоматического.

Другие вопросы по теме