Both "lateinit" and "by lazy" are Kotlin Property initializers.
Console Output:
lateinit:
- Use it with mutable variable [var]
- Allowed with only non-nullable data types
- This modifier is not allowed on properties of primitive types
- It is a promise to compiler that the value will be initialized in future.
- If you try to access lateinit variable without initializing it then it throws UnInitializedPropertyAccessException.
by lazy:
- Lazy initialization was designed to prevent unnecessary initialization of objects.
- Your variable will not be initialized unless you use it.
- It is initialized only once. Next time when you use it, you get the value from the memory.
- It is thread safe (It initializes in the thread where it is used for the first time. Other threads use the same value stored in the cache).
- The variable can only be val.
- The variable can only be non-nullable.
class Basic { private lateinit var strMsg: String private val strMsg1: String by lazy { println("Lazy Initializing - Variable born") return@lazy "Tester" } fun initBasic() { //Late Initialization - Check println("strMsg initialization status is ${::strMsg.isInitialized}"); strMsg = "Testing" println("strMsg value is $strMsg, now the initialization status is ${::strMsg.isInitialized}"); //Lazy Initialization - Check println("strMsg1 value is ${strMsg1}"); } }
fun main(ar: Array<String>) { Basic().initBasic() }
Console Output:
strMsg initialization status is false strMsg value is Testing, now the initialization status is true Lazy Initializing - Variable born strMsg1 value is Tester