openxava / documentación / Lección 10: Propiedades calculadas

Curso: 1. Primeros pasos | 2. Modelo básico del dominio (1) | 3. Modelo básico del dominio (2) | 4. Refinar la interfaz de usuario | 5. Desarrollo ágil | 6. Herencia de superclases mapeadas | 7. Herencia de entidades | 8. Herencia de vistas | 9. Propiedades Java | 10. Propiedades Calculadas  | 11. @DefaultValueCalculator en colecciones | 12. @Calculation y totales de colección | 13. @DefaultValueCalculator desde archivo | 14. Evolución del esquema manual | 15. Cálculo de valor por defecto multiusuario | 16. Sincronizar propiedades persistentes y calculadas | 17. Lógica desde la base de datos | 18. Validando con @EntityValidator | 19. Alternativas de validación  | 20. Validación al borrar  21. Anotación Bean Validation propia | 22. Llamada REST desde una validación  | 23. Atributos en anotaciones  | 24. Refinar el comportamiento predefinido | 25. Comportamiento y lógica de negocio | 26. Referencias y colecciones | A. Arquitectura y filosofía | B. Java Persistence API | C. Anotaciones | D. Pruebas automáticas

Tabla de contenidos

Lección 10: Propiedades calculadas
Propiedades calculadas
Propiedad calculada simple
Resumen
Hemos establecido lógica de negocio a partir de crear getters y setters, hemos visto el uso de la librería Lombok y su aplicabilidad, veremos ahora como aplicar otro tipo de propiedades a nuestra aplicación.
Si no te gustan los videos sigue las instrucciones a continuación.

Propiedades calculadas

Quizás la lógica de negocio más simple que puedes añadir a tu aplicación es una propiedad calculada. Las propiedades que has usado hasta ahora son persistentes, es decir, cada propiedad se almacena en una columna de una tabla de la base de datos. Una propiedad calculada es una propiedad que no almacena su valor en la base de datos, sino que se calcula cada vez que se accede a la propiedad. Observa la diferencia entre una propiedad persistente y una calculada:
// Propiedad persistente
@Getter @Setter // Tiene getter y setter
int cantidad; // Tiene un campo, por tanto es persistente
 
// Propiedad calculada
public int getImporte() { // No tiene campo, ni setter, solo un getter
    return cantidad * precio; // con un cálculo
}
Las propiedades calculadas son reconocidas automáticamente por OpenXava. Puedes usarlas en vistas, listas tabulares o cualquier otra parte de tu código.
Vamos a usar propiedades calculadas para añadir el elemento “económico” a nuestra aplicación facturacion. Porque, tenemos líneas de detalle, productos, cantidades. Pero, ¿qué pasa con el dinero?

Propiedad calculada simple

El primer paso será añadir una propiedad de importe a Detalle. Lo que queremos es que cuando el usuario elija un producto y teclee la cantidad el importe de la línea sea recalculado y mostrado al usuario:
business-logic_es010.png
Añadir esta funcionalidad a tu actual código es prácticamente añadir una propiedad calculada a Detalle. Simplemente añade el código siguiente a la clase Detalle:
@Money
@Depends("producto.numero, cantidad") // Cuando usuario cambie producto o cantidad
public BigDecimal getImporte() { // esta propiedad se recalculará y se redibujará
    if (producto == null || producto.getPrecio() == null) return BigDecimal.ZERO;
    return new BigDecimal(cantidad).multiply(producto.getPrecio());
}
Es tan solo poner el cálculo en getImporte() y usar @Depends para indicar a OpenXava que la propiedad importe depende de producto.numero y cantidad, así cada vez que el usuario cambia alguno de estos valores la propiedad se recalculará. Fíjate como en este caso usamos producto y no getProducto(), y cantidad en vez de getCantidad(), porque desde dentro de la clase sí que se puede acceder directamente a sus campos.
Ahora has de añadir esta nueva propiedad a la lista de propiedades mostradas en la colección detalles de DocumentoComercial:
@ElementCollection
@ListProperties("producto.numero, producto.descripcion, cantidad, importe") // importe añadida
Collection<Detalle> detalles;
Nada más. Tan solo necesitas añadir el getter y modificar la lista de propiedades. Ahora puedes probar los módulos Factura y Pedido para ver la propiedad importe en acción.

Resumen

En esta lección has aprendido la aplicación de propiedades calculadas y sus diferencias de las propiedades persistentes, a la hora de establecer lógica de negocio. En futuras lecciones veremos cómo trabajar con colecciones y totales.

Descargar código fuente de esta lección

¿Problemas con la lección? Pregunta en el foro ¿Ha ido bien? Ve a la lección 11