본문 바로가기
프로그래밍 놀이터/Kotlin

[Kotlin] check lateinit is initialized (safely accessing lateinit vars)

by 돼지왕왕돼지 2020. 8. 12.


kotlin check lateinit initialized


https://blog.jetbrains.com/kotlin/2017/09/kotlin-1-2-beta-is-out/


-

Exception in thread "main" kotlin.UninitializedPropertyAccessException


위의 exception 을 마딱뜨린 사람이 은근 많을 것이다.

그렇다 저 녀석은 lateinit 이라고 선언된 var 에 값이 assign 되기 전에 접근할 때 생기는 exception 이다.



-

Kotlin 1.2 에서 추가된 기능이 있는데, 바로 reflection 방식을 이용한 isInitialized 함수이다.

lateinit var file:File

// ...

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


-

reflection 방식이기 때문에 class 외부에서 lateinit var 가 init 되었는지 확인하기는 어렵다.

그래서 해당 class 내부에서 init 되었는지 확인하는 함수를 제공해주어야 한다.



-

개인적으로 이 함수의 사용은 지극히 안티 패턴(anti-pattern)이라 생각한다.

개인적으로 lateinit 의 본질은 android 의 onCreate 나 test framework 의 @Before annotated function 등 일반적인 sequential flow 와 다른 생명주기를 가진 경우에만 사용해야 한다.

즉 원래 constructor 에서 해야 하는 일인데, 이를 다른 생명주기를 가진 framework 에서 constructor 를 대체하는 함수에서 init 하겠다는 의미로 사용해야 한다고 본다.


그래도 이 것을 정리하는 이유는?

anti-pattern 이더라도 언젠가는 어떠한 이유로 쓸 수 밖에 없는 경우가 생길 수는 있기 때문이다...



-

끝!!




댓글0