Optimiza memoria y rendimiento con lazy properties: inicializan su valor solo cuando el código realmente lo necesita. Así evitas cargar objetos pesados por adelantado y reduces el coste de arranque de tus estructuras y clases, manteniendo propiedades sin uso fuera de memoria hasta el primer acceso.
¿Qué es una lazy property y por qué importa?
Las lazy stored properties son propiedades cuyo valor no se crea en la inicialización del objeto, sino en el momento del primer uso. Esto es clave cuando algunas propiedades quizá nunca se usen o cuando su creación sea costosa.
Se declara anteponiendo la palabra lazy a una stored property.
No se inicializa hasta que se accede por primera vez en código.
Reduce consumo de memoria si la propiedad es pesada.
Evita trabajo innecesario cuando la propiedad no se utiliza.
¿Cómo implementarla en un caso real con un data importer?
Imagina una clase encargada de importar datos de un fichero externo: un data importer con un filename (por ejemplo, "data.txt"). Un data manager orquesta distintos importadores (local, nube, peer to peer, etc.) y guarda los datos en un array de strings. Aquí conviene que el importador sea lazy porque puede ser muy pesado (conexiones, buffers, hosts, conversiones), mientras que un array vacío apenas ocupa memoria.
classDataImporter{var filename ="data.txt"// ... funcionalidad de importación}classDataManager{lazyvar importer =DataImporter()// Se crea al primer uso.var data:[String]=[]// Liviana: no necesita ser lazy.}let manager =DataManager()manager.data.append("Elemento 1")manager.data.append("Elemento 2")// Hasta aquí, 'importer' no se ha creado._= manager.importer.filename // Primer acceso: aquí se crea 'importer'.
¿Qué ocurre antes y después del primer acceso?
Antes de pedirle nada al importador, el data manager funciona con normalidad: puedes leer y añadir a data sin que el importer exista en memoria. En el instante en que accedes a una propiedad del importador (por ejemplo, su filename), el sistema reserva memoria, crea el objeto y ya queda disponible.
Data accesible desde el inicio: manager.data funciona sin crear el importador.
Importador diferido: manager.importer no existe hasta el primer acceso efectivo.
Primer acceso significativo: al consultar manager.importer.filename, se crea y usa "data.txt".
Estado previo: al inspeccionarlo antes del acceso, el importador aparece como nil (no inicializado) aunque esté declarado.
¿Cuándo conviene usarla y cuándo no?
Usa lazy cuando una propiedad pueda ser costosa o rara vez utilizada. Evítala en propiedades livianas y triviales.
Úsala si la propiedad es una clase pesada: múltiples métodos, muchas propiedades, buffers, hosts, descargas y conversiones.
Úsala si el objeto puede no usarse nunca: ahorra memoria hasta que sea necesario.
No la uses en propiedades ligeras: por ejemplo, un array de strings vacío apenas ocupa memoria.
Beneficio clave: la propiedad permanece en nil y fuera de memoria hasta requerirse, creando el objeto justo a tiempo.
¿Te gustaría compartir un caso donde aplicarías una lazy property o tienes dudas sobre su primer uso? Comenta tu escenario y lo revisamos juntos.
Como ejemplo, DataImported es una clase muy pesada que se encarga de realizar muchas cosas:
classDataImported{var fileName ="data.txt"}
La clase DataManager se encarga de manejar los distintos tipos de importación de archivos:
classDataManager{lazyvar importer =DataImported()var data =[String]()}
Al usar lazy delante de la variable importer, esta no va a ser creada automáticamente cuando se crea el manager hasta que realmente sea necesario.
let manager =DataManager()manager.data.append("Algo de datos")manager.data.append("Muchos mas datos")
Hasta esta linea, el importer no ha sido creado...
manager // nil
manager.importer.fileName
En este momento se da la instrucción de inicializar la variable importer de la clase DataManager(). A partir de aca la variable importer ya ha sido creada.
manager // {fileName "data.txt"}
No podía encontrar algo mejor explicado de lazy var, excelente video
Muy interesante lo de lazy properties, qué otros lenguajes tienen este feature? 🤔
En Kotlin sería como lateinit
cual seria el equivalente de esto en c#?
y que herramienta recomiendas para "medir" el peso de las propiedades o clases que nos ayude a tomar la decisión de hacer lazy una propiedad
amigo dudo que exista una herramienta para eso en realidad es una cuestión de debugear, es mas como de experiencia y diseño de un software en que sabes que vas a ocupar algo en una clase digamos que es otra clase muy pesada en ram y vas a usar a ese objeto hasta el final de una rutina entonces la haces lazy , en si el chiste es si no lo necesitas todo el tiempo en memoria hazlo lazy , por ejemplo se me ocurre una clase ticket que se manda a llamar de una clase venta, pero la venta solo genera el ticket al final entonces colocas lazy en el ticket
Una lazy stored property no se inicializa hasta que se accede a ella por primera vez, lo que ahorra memoria si nunca se usa. En cambio, una computed property calcula su valor cada vez que se accede a ella, lo que significa que su valor puede cambiar. Ambas tienen usos distintos según la necesidad de eficiencia y dinámica en la aplicación.
el concepto de lazy stored properties***(lazy)*** es: La propiedad no se inicializa hasta que sea utilizada por primera vez.
Se me hace o estoy alusinando,
Entre Kotlin y Swift la sintaxis es casi semejante, lo que cambia son las palabras reservadas de cada idioma
En Kotlin sería:
lateinit varadapter:MyAdapteradapter =MyAdapter()
Para que se hagan alguna idea.
Cuando solicito un atributo o un método de la variable lazy, en memoria se crea una instancia de la clase con todos sus atributos y métodos o solo el atributo o método que estoy solicitando?
Para hacer lazy una Stored Properties tengo que declararla siempre como variable o tambien podria declararla como constante?
Hola David.
No, las constantes no se pueden declarar como lazy, esto según entiendo es debido a que las propiedades constantes siempre deben tener un valor antes de que se complete su inicialización.