Lateinit vs Lazy in Kotlin: Understanding the Key Differences
Deepak Kumar ??
? Co-Founder & CEO @ Itboomi | AI-Powered Mobile App Development | AI Agents & Automation for Business Growth
In this post, we’ll explore two of Kotlin’s features,?lateinit?and?lazy, and examine how they are used to control the initialization of variables.
Lateinit
lateinit?is a keyword that can be used to declare a non-nullable property that is not initialized at the time of declaration. Instead, the property is initialized later, either in the constructor or in another method. The?lateinit?keyword is useful when you want to delay the initialization of a property until a certain point in time, for example, when you need to perform some calculations or retrieve a value from a database.
To use?lateinit, you need to add the?lateinit?keyword before the property declaration, like this:
class Example {
lateinit var name: String
fun init() {
name = "DeeAndroid"
}
}
Note that?lateinit?can only be used with non-nullable properties of primitive types or?String. If you try to use?lateinit?with a nullable property or with a property of a custom class type, you will get a?compile-time error.
Once you have declared a property with?lateinit, you can access it just like any other property. However, you need to make sure that the property is initialized before you use it, or you will get a?UninitializedPropertyAccessException. To check whether a?lateinit?property has been initialized, you can use the?isInitialized?property, like this:
val example = Example()
if (::name.isInitialized) {
println(example.name)
} else {
println("Name is not initialized yet")
}
Lazy
lazy?is a function that allows you to delay the initialization of a property until it is actually used for the first time. Unlike?lateinit,?lazy?does not require you to initialize the property yourself. Instead, it generates the value of the property the first time it is accessed, and it caches the result for subsequent accesses.
To use?lazy, you need to pass a lambda expression to the?lazy?function, like this:
val name: String by lazy {
"DeeAndroid"
}
Note that?lazy?can be used with properties of any type, including nullable properties and properties of custom class types. Additionally,?lazy?is thread-safe, which means that it can be safely used in multithreaded environments.
Once you have declared a property with?lazy, you can access it just like any other property. However, you don't need to worry about whether the property has been initialized or not, as?lazy?takes care of that for you.
Conclusion
lateinit?and?lazy?are two features in Kotlin that allow you to control the initialization of properties.?lateinit?is useful when you want to delay the initialization of a property until a certain point in time, and it can only be used with non-nullable properties of primitive types or?String.?lazy, on the other hand, is useful when you want to delay the initialization of a property until it is actually used for the first time, and it can be used with properties of any type, including nullable properties and properties of custom class types.
When deciding between?lateinit?and?lazy, it is important to consider the following factors:
lateinit?and?lazy?are both useful features in Kotlin that provide different ways to control the initialization of properties. Choose the one that fits your specific use case and provides the level of type safety and performance that you need.
Android Developer | Kotlin
9 个月Great article for pointing out the main differences between both features. However, I suggest an edit to one main point mentioned. After careful investigation I've come to assert that while it is true for "lazy" to be applied for any type (primitive or non-primitive). "lateinit" only works with non-primitive types -as opposed to what's mentioned in this article in the Lateinit & Conclusion sections- as this highlighted paragraph in the kotlin documentation suggests https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables:~:text=This%20modifier%20can,a%20primitive%20type. Under the hood, a lateinit property is provided a null value to indicate that it has not been initialized yet, and primitive types can't store null, therefore it will work with String and custom classes, but if used with Int or Boolean the following compile error will be thrown "'lateinit' modifier is not allowed on properties of primitive types".