Middle
¿Cuándo se debe usar 'lateinit' y 'by lazy' en Kotlin?
sobes.tech AI
Respuesta de la IA
lateinit se usa para propiedades no nulas que se inicializarán más tarde, antes del primer acceso a ellas. Se aplica con var.
class UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // Se inicializará en onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Ahora se puede usar binding
}
}
by lazy se usa para propiedades no nulas o nulas, que se inicializan en el primer acceso a ellas. Se aplica con val.
class DataManager {
val apiService: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Comparación:
| Característica | lateinit |
by lazy |
|---|---|---|
| Uso | var |
val |
| Tipo de propiedad | No nulo | No nulo o nulo |
| Inicialización | Tardía, manualmente | En el primer acceso, automáticamente |
| Seguridad en hilos | No garantizado por defecto (si no se sincroniza manualmente) | Garantizado por defecto (sincronizado) |
| Valor nulo | No permitido antes de la inicialización ( lanzará excepción) | No (el tipo se determina por el inicializador) |
Usa lateinit cuando el valor de la propiedad depende del contexto u otros factores y debe establecerse después de crear el objeto, pero antes de su uso (por ejemplo, al enlazar vistas en una Activity de Android).
Usa by lazy para propiedades que son costosas de crear o que pueden no ser necesarias durante toda la vida del objeto, o cuando la inicialización debe retrasarse hasta el primer uso real.