openxava / documentación / Lección 9: Propiedades Java

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 9: Propiedades Java
Conceptos
Resumen
Has convertido tu modelo del dominio en una aplicación web plenamente funcional. Esta aplicación ya es bastante útil de por sí, aunque aún puedes hacerle muchas mejoras. Transformemos pues tu aplicación en algo más serio, y de paso, aprendamos algunas cosas interesantes sobre OpenXava.
Comencemos por aprender algunos conceptos básicos de Java, como las propiedades.
Si no te gustan los videos sigue las instrucciones a continuación.

Conceptos

Para entender bien algunos de los conceptos de las lecciones venideras, has de saber cómo funcionan las propiedades en Java. La forma estándar de definir una propiedad en Java es:
// Propiedad
      
private int cantidad; // Tiene un campo

public int getCantidad() { // Un getter para devolver el valor del campo
    return cantidad;
}

public void setCantidad(int cantidad) { // Cambia el valor del campo
    this.cantidad = cantidad;
}
Esto se basa en la idea de que nunca deberiamos acceder al estado de un objeto (sus campos) directamente, sino siempre llamando a métodos. Esto es muy útil porque puedes cambiar la implementación de una propiedad sin afecta al codigo que la usa. Además, todas las herramientas, marcos de trabajo y librerias del ecosistema Java confían en esta norma (parte de las especificaciones JavaBeans). Por lo tanto, deberiamos usar esta convención siempre. Una propiedad en Java es un método getter (getCantidad() por ejemplo) y un método setter (setCantidad(int cantidad)) si la propiedad es modificable. De hecho, el campo (private int cantidad en este caso) no es necesario.
El problema de este enfoque es que es muy verboso y acabamos con nuestro código lleno de getters y setters que no aportan nada y hacen mucho ruido. Para resolver este problema usamos una librería llamada Lombok. Con Lombok puedes definir la propiedad cantidad de arriba de esta manera:
@Getter @Setter // Genera un método getter y uno setter
int cantidad; 
@Getter y @Setter generan el getter y setter en el código compilado, por lo que cuando accedas a la propiedad has de usarlos, así:
int c = elObjeto.getCantidad(); // Nunca int c = elObjeto.cantidad 
elObjeto.setCantidad(c + 10); // Nunca elObjeto.cantidad = c + 10
Puedes declarar @Getter y @Setter a nivel de clase y así todos los campos tendrán getter y setter automáticamente. Y por supuesto, puedes escribir tu propio setter y getter si quieres usar tu propia lógica:
// @Data // NUNCA USES @Data
@Getter @Setter
public class Incidencia {

    int numero;
    String descripcion;
	
    public String getDescripcion() { // Tu propio getter sobrescribe el generado por Lombok
        if (descripcion == null) return "Todavía sin descripción";
        return descripcion;
    }

}
En este caso Lombok genera para ti getNumero(), setNumero() y setDescripcion() mientras que getDescripcion() es el que hemos escrito nosotros. Fíjate como nunca deberías usar la anotación @Data de Lombok, dado que produce bucles recursivos infinitos si tienes referencias recíprocas, algo bastante común en las aplicaciones de negocio.

Resumen

En esta lección has aprendido algunas formas comunes de añadir lógica de negocio a tus entidades. Vimos el funcionamiento de la librería Lombok, cómo definir getters y setters de manera manual, a fin de establecer una lógica personalizada a nuestra aplicación.

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