propiedades - Comparación de JavaBeans
javabeans tutorial español (2)
¿Alguien sabe acerca de una biblioteca de fuente abierta gratuita (clase de utilidad) que le permite comparar dos instancias de un bean Java y devolver una lista / matriz de propiedades cuyos valores son diferentes en esas dos instancias? Por favor, publique una pequeña muestra.
Aclamaciones
Tomás
BeanComparator of Apache commons es lo que estás buscando.
Actualización . Un ejemplo simple que compara JavaBeans con una propiedad (la comparación se realiza en una sola propiedad, debe crear tantos BeanComparators como las propiedades que quiera emparejar).
import org.apache.commons.beanutils.BeanComparator;
public class TestBeanComparator
{
public TestBeanComparator()
{
}
public class TestBean
{
int value;
public TestBean()
{
}
public int getValue()
{
return value;
}
public void setValue(int value)
{
this.value = value;
}
}
public static void main(String[] args)
{
TestBeanComparator tbc = new TestBeanComparator();
tbc.go();
}
public void go()
{
TestBean tbs [] = new TestBean[10];
for (int i = 0; i < tbs.length; i++)
{
tbs[i] = new TestBeanComparator.TestBean();
tbs[i].setValue((int) (Math.random() * 10));
System.out.println("TestBean["+i+"] = " + tbs[i].getValue());
}
BeanComparator bc = new BeanComparator("value");
System.out.println("");
System.out.println("Value to match: " + tbs[0].getValue());
for (int i = 1; i < tbs.length; i++)
{
if(bc.compare(tbs[i], tbs[0]) == 0)
{
System.out.println("Match found in bean "+ i);
}
}
}
}
Después de algunas pruebas, un resultado es exitoso. Este es el resultado:
TestBean[0] = 0
TestBean[1] = 4
TestBean[2] = 0
TestBean[3] = 2
TestBean[4] = 7
TestBean[5] = 3
TestBean[6] = 0
TestBean[7] = 3
TestBean[8] = 7
TestBean[9] = 3
Value to match: 0
Match found in bean 2
Match found in bean 6
Obviamente, aumentar el tamaño de la matriz TestBean aumentará las posibilidades de obtener coincidencias.
Debe importar a su proyecto los siguientes archivos jar: commons-logging- versión .jar, commons-beanutils- versión .jar, commons-beanutils-core- versión .jar, commons-beanutils-bean-collections- versión .jar, commons -collections- version .jar.
Los archivos se incluyen dentro de las API de colecciones commons-logging , commons-beanutils y commons-collections .
BeanComparator
se puede usar para ordenar colecciones .
Es una implementación de Comparator
que compara los beans en función de un valor de propiedad compartido.
BeanComparators
son comparadores genéricos que pueden actuar sobre cualquier Java Bean. Con un buen sistema subyacente de reflexión de frijol, pueden manejar un frijol con propiedades de frijoles, matrices, colecciones y mapas.Si tenemos una lista
java.util.List
de Java Beans de tipoPerson
, dondePerson
tiene una edad que es unInteger
, un nombre que es una Cadena y un país que es un Bean de País (que a su vez tiene un Nombre de Cadena) - puede ordenarlo de todos modos que queramos con unBeanComparator
.
List people = ...; // list of Person objects
//sort by age
BeanComparator comp = new BeanComparator("age");
Collections.sort(list, comp);
//sort by name
BeanComparator comp = new BeanComparator("name");
Collections.sort(list, comp);
//sort by country name
BeanComparator comp = new BeanComparator("country.name");
Collections.sort(list, comp);
No es necesario escribir un PersonComparator
con muchas opciones de propiedades para ordenar. En cambio, una sola clase de BeanComparator
se ocupa de todo.
Encontrará un ejemplo completo aquí , con el siguiente escenario:
Si estaba implementando un comparador para comparar propiedades dinámicamente (por ejemplo, piense en ordenar filas en una tabla en una página web según la columna que seleccione el cliente), podría posponer la construcción de su comparador hasta que sepa a qué propiedad se ha seleccionado. clasificación.
Aquí es donde
BeanComparator
realmente brilla. Las cantidades masivas de código que normalmente escribiría para implementar este comportamiento se reducen a unas pocas líneas cuando usaBeanComparator
.