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()
}
}