Как проверить, была ли инициализирована переменная "lateinit"?


интересно, есть ли способ проверить, если lateinit переменная была инициализирована.

import javafx.application.Application
import javafx.event.EventHandler
import javafx.geometry.Insets
import javafx.geometry.Pos
import javafx.scene.Scene
import javafx.scene.control.Button
import javafx.scene.control.ComboBox
import javafx.scene.layout.VBox
import javafx.stage.DirectoryChooser
import javafx.stage.Stage
import java.io.File

class SeriesManager() {
    lateinit var seriesDir: File
    val allSeries by lazy {
        seriesDir.listFiles().map { it.name }.toTypedArray()
    }
}

class SeriesManagerUI : Application() {
    override fun start(primaryStage: Stage) {
        val sm = SeriesManager()

        val setSeriesDirBtn = Button("Change all series location").apply {
            onAction = EventHandler {
                sm.seriesDir = DirectoryChooser().apply {
                    title = "Choose all series location"
                }.showDialog(primaryStage)
            }
        }
        val allSeriesList = ComboBox<String>().apply {
            promptText = "Select a series from here"
            isDisable = // I want this to be always true, unless the SeriesManager.seriesDir has been initialized
        }
        val setCurrentEpisodeBtn = Button("Change the current episode")
        val openNextEpisode = Button("Watch the next episode")

        val layout = VBox(
            setSeriesDirBtn,
            allSeriesList,
            setCurrentEpisodeBtn,
            openNextEpisode
        ).apply {
            padding = Insets(15.0)
            spacing = 10.0
            alignment = Pos.CENTER
        }

        primaryStage.apply {
            scene = Scene(layout).apply {
                minWidth = 300.0
                isResizable = false
            }

            title = "Series Manager"
        }.show()
    }
}

fun main(args: Array<String>) {
    Application.launch(SeriesManagerUI::class.java, *args)
}
2 127

2 ответа:

попробуйте использовать его, и вы получите UninitializedPropertyAccessException если он не инициализируется.

lateinit специально для случаев, когда поля инициализируются после построения, но до фактического использования (модель, которую используют большинство фреймворков инъекций). Если это не ваш usecase lateinit может быть не правильный выбор.

EDIT: на основе того, что вы хотите сделать что-то вроде этого будет работать лучше:

val chosenFile = SimpleObjectProperty<File?>
val button: Button

// Disables the button if chosenFile.get() is null
button.disableProperty.bind(chosenFile.isNull())

есть lateinit улучшение в Kotlin 1.2, что позволяет проверить состояние инициализации lateinit переменной напрямую:

lateinit var file: File    

if (::file.isInitialized) { ... }

смотрите объявление на блог компании JetBrains или сохранить предложение.

обновление: Котлин 1.2 был выпущен. Вы можете найти lateinit улучшения здесь: