Лучшая альтернатива для ключевого слова объекта в kotlin - PullRequest
0 голосов
/ 10 октября 2019
 private val timer = object : CountDownTimer(result, 1000) {
    override fun onFinish() {
        //delete the database entry
    }

    override fun onTick(millisUntilFinished: Long) {
        //more code

    }

}

Насколько мне известно в kotlin, объект вызывается до того, как result будет присвоено значение

. Сначала значение result равно 0, затем оно обновляется в другой функции,но таймер вызывается со значением result, равным 0.

Так что же должно быть лучшей заменой object здесь?

Ответы [ 2 ]

4 голосов
/ 10 октября 2019

Вы можете оставить object, вам просто нужно изменить порядок инициализации. Один из способов - использовать by lazy, например:

    var result = 0L

    private val timer: CountDownTimer by lazy {
        object : CountDownTimer(result, 1000) {
            override fun onFinish() {
                // delete the database entry
            }

            override fun onTick(millisUntilFinished: Long) {
                // more code
            }
        }
    }

    // 'init' block just as an example; the below code works anywhere
    // such as in onCreate(), onStart() or wherever
    init {
        result = 1000
        // 'timer' is initialized with result=1000 and then started
        timer.start()
    }

lazy - это так называемый делегат свойства, подробнее об этом можно прочитать в официальных документах , например. .

0 голосов
/ 10 октября 2019

Я не вижу, как это связано с Kotlin?

  • У вас есть член val: timer
  • Инициализируется, когда объект, в котором находится val, являетсясоздал.

Так что проблема не в том, какой синтаксис вы используете. Это время, когда вы создаете таймер. Если вы знаете, когда собираетесь его использовать, и уверены, что к этому времени результат будет инициализирован, вы можете использовать отложенную инициализацию.

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