The type of the property or variable 는 반드시 non-nullable 이어야 한다.
primitive type은 lateinit var로 지정할 수 없다.
초기화 하기 전에 lateinit var에 접근하면 exception이 발생한다.
.isInitialized
를 이용해서 값이 초기화 되었는지 확인할 수 있다.
data class Foo(val name: String)
lateinit var some: Foo
fun main() {
println(::some.isInitialized) // false
}
property를 first-class object로 접근하기 위해서 ::
연산자를 사용한다.
val x = 1
fun main() {
println(::x.get()) // 1
println(::x.name) // x
}
::x
는 KProperty0<Int>
type property object로 평가된다.
get()
을 사용해서 객체가 가진 값을 읽을 수 있다.
name
property를 이용해서 property name을 얻을 수 있다.
var 객체는 KMutableProperty0<Type>
이고, set()
을 이용해서 값을 설정할 수 있다.
lateinit은 선언 시점에는 초기화 하지 않지만, 사용하는 시점에는 초기화를 해서 어떤 값을 가진다는 의미다. 따라서 값을 가지지 않는다는 의미의 nullable과는 의미상 어울리지 않아서 사용할 수 없다.
Why doesn't Kotlin allow you to use lateinit with primitive types?
나중에 초기화 하는 lateinit과 선언과 동시에 초기화한다는 val의 의미가 어울리지 않아서라고 생각한다.