Как проверить, была ли инициализирована переменная "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 ответа:
попробуйте использовать его, и вы получите
UninitializedPropertyAccessException
если он не инициализируется.
lateinit
специально для случаев, когда поля инициализируются после построения, но до фактического использования (модель, которую используют большинство фреймворков инъекций). Если это не ваш usecaselateinit
может быть не правильный выбор.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
улучшения здесь: