Sobes.tech
Middle

¿Cuál es la diferencia entre usar la palabra clave 'lateinit' y delegar con 'by lazy {}' en Kotlin?

sobes.tech AI

Respuesta de la IA

lateinit se utiliza para la inicialización diferida de propiedades mutables (var) que no pueden ser nulas y que se inicializarán más tarde, por ejemplo, en el método del ciclo de vida de una actividad o fragmento. El compilador no garantiza la inicialización, y acceder a una propiedad no inicializada provocará una excepción UninitializedPropertyAccessException.

by lazy {} se usa para la inicialización diferida de propiedades inmutables (val). La inicialización se realiza en el primer acceso a la propiedad, y el resultado se almacena en caché. Esto es seguro para hilos por defecto y garantiza que el inicializador se llame solo una vez.

Característica lateinit by lazy {}
Aplicable a var val
Nullable No nullable No nullable
Garantía de inicialización No (solo por el desarrollador) Sí (en el primer acceso)
Seguridad en hilos No garantizado por defecto Sí (por defecto)
Tipo de propiedad Mutables Inmutables

Ejemplo con lateinit:

class MyActivity : AppCompatActivity() {

    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView = findViewById(R.id.my_text_view)
        textView.text = "¡Hola, lateinit!"
    }
}

Ejemplo con by lazy {}:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // Inicialización en el primer uso

    private fun provideApiService(): ApiService {
        // Lógica para crear ApiService
        return ApiService()
    }

    fun fetchData() {
        // apiService se inicializa aquí en la primera llamada a fetchData()
        apiService.getData()
    }
}