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 이더라도 언젠가는 어떠한 이유로 쓸 수 밖에 없는 경우가 생길 수는 있기 때문이다...
-
끝!!
'프로그래밍 놀이터 > Kotlin, Coroutine' 카테고리의 다른 글
[Kotlin] Coroutine 은 어떻게 동작하는가? (0) | 2020.08.23 |
---|---|
[coroutine] java.lang.IllegalStateException: Module with the Main dispatcher is missing. Add dependency providing the Main dispatcher, e.g. 'kotlinx-coroutines-android' (0) | 2020.08.16 |
[Kotlin] Kotlin 으로 build gradle 을 작성하자! (0) | 2020.08.10 |
[kotlin] safe when statement (0) | 2020.08.09 |
[kotlin] Sealed class 를 이용하여 error 를 다루는 방법 (1) | 2020.08.08 |
댓글