Sobes.tech
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.