Necesito comparar docenas de campos en dos objetos (instancias de la misma clase), y hacer un poco de registro y actualización en caso de que haya diferencias. Meta código podría ser algo como esto:¿Cuál es la mejor manera de comparar varias propiedades javabean?
if (a.getfield1 != b.getfield1)
log(a.getfield1 is different than b.getfield1)
b.field1 = a.field1
if (a.getfield2!= b.getfield2)
log(a.getfield2 is different than b.getfield2)
b.field2 = a.field2
...
if (a.getfieldn!= b.getfieldn)
log(a.getfieldn is different than b.getfieldn)
b.fieldn = a.fieldn
El código con todas las comparaciones es muy concisa, y me gustaría hacer de alguna manera más compacta. Sería bueno si pudiera tener un método que tomaría como método de parámetros las llamadas a setter y getter, y llamar a esto para todos los campos, pero desafortunadamente esto no es posible con java.
He encontrado tres opciones, cada una de las cuales tiene sus propios inconvenientes.
1. Uso de la API de reflexión para averiguar captadores y definidores
feo y podría causar errores de tiempo de ejecución en nombres de los casos de campos cambian
2. Cambiar los campos al público y manipularlos directamente sin utilizar captadores y definidores
feo, así y expondría implementación de la clase de mundo externo
3. Tener la clase que contiene (entidad) hacer la comparación, actualizar cambiado campos y ret urna mensaje de registro
Entidad no deben tomar parte en la lógica de negocio
Todos los campos son de tipo String, y puedo modificar el código de la clase propietaria de los campos, si es necesario.
EDITAR: Hay algunos campos de la clase que no se pueden comparar.
¿Está comparando los casos de dos clases diferentes o dos instancias de la misma clase? – rudolfson
Son instancias de la misma clase. Edité la pregunta. Gracias por señalar esto. – tputkonen