java - que - harina de grano entero marcas
cómo comparar genéricamente granos enteros de Java? (4)
He intentado asimilar la biblioteca org.apache.commons.beanutils para un método / idioma para evaluar la igualdad de todas las propiedades entre 2 instancias, es decir, un método genérico equals () para beans.
¿Hay una manera simple de hacer esto usando esta biblioteca? ¿O estoy yendo sobre esto de la manera incorrecta? Gracias.
Como se mencionó anteriormente, una implementación basada en la reflexión hará lo que usted desee. Solo quería advertirles que esa reflexión es bastante costosa y que una implementación de este tipo podría ser comparativamente lenta. Si solo necesitas hacer comparaciones ocasionales, estarás bien. Sin embargo, si tiene grandes conjuntos de datos y frecuentes controles de igualdad (por ejemplo, filtrado de tablas grandes), puede tener problemas.
Pruebe EqualsBuilder.reflectionEquals () de commons-lang . EqualsBuilder tiene un conjunto de métodos para incluir todos los campos, todos los campos no transitorios y todos los campos excepto ciertos.
Si todo lo demás falla, el código podría servir como un buen ejemplo de cómo implementar esto.
O, aunque no es una respuesta directa a su pregunta, pero podría ser una respuesta a su problema (es decir, eliminar el esfuerzo de hacer un código estándar mientras es súper rápido)
si usa Eclipse, los siguientes pasos generarán automáticamente el hashCode e igualarán para usted:
Fuente> Generar hashCode y es igual a ...
y luego selecciona los campos, ¡es súper efectivo! :RE
Saludos y espero que ayude a cualquiera que venga aquí con el propósito de recortar algo de tiempo escribiendo repeticiones.
PD: estoy seguro de que otros IDEs populares deben tener características similares.
Para responder a su pregunta directamente, puede usar el reflejo para hacer una comprobación de igualdad de los beans. Hay algunos inconvenientes que debes tener en cuenta.
Existen reglas con respecto al comportamiento de equals () y hashcode (). Estas reglas hablan de simetría, consistencia y reflexividad, que pueden ser difíciles de hacer cuando el método de igualdad se comporta de forma dinámica en función del otro objeto que está pasando.
Lectura interesante: http://www.geocities.com/technofundo/tech/java/equalhash.html
En general, creo que es mejor que crees tu propio código hash e iguales métodos. Hay muchos complementos buenos que pueden generar automáticamente ese código en función de las propiedades de la clase.
Habiendo dicho todo esto, estos son algunos métodos (antiguos) para obtener getters, setters y propiedades que escribí hace mucho tiempo:
private Map getPrivateFields(Class clazz, Map getters, Map setters) {
Field[] fields = clazz.getDeclaredFields();
Map m = new HashMap();
for (int i = 0; i < fields.length; i++) {
int modifiers = fields[i].getModifiers();
if (Modifier.isPrivate(modifiers) && !Modifier.isStatic(modifiers) && !Modifier.isFinal(modifiers)) {
String propName = fields[i].getName();
if (getters.get(propName) != null && setters.get(propName) != null) {
m.put(fields[i].getName(), fields[i]);
}
}
}
return m;
}
Los Getters:
private Map getGetters(Class clazz) {
Method[] methods = clazz.getMethods();
Map m = new HashMap();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("get")) {
int modifiers = methods[i].getModifiers();
if (validAccessMethod(modifiers)) {
m.put(getPropertyName(methods[i].getName()), methods[i]);
}
}
}
return m;
}
Y los Setters:
private Map getSetters(Class clazz, Map getters) {
Method[] methods = clazz.getMethods();
Map m = new HashMap();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("set")) {
int modifiers = methods[i].getModifiers();
String propName = getPropertyName(methods[i].getName());
Method getter = (Method) getters.get(propName);
if (validAccessMethod(modifiers) && getter != null) {
Class returnType = getter.getReturnType();
Class setType = methods[i].getParameterTypes()[0];
int numTypes = methods[i].getParameterTypes().length;
if (returnType.equals(setType) && numTypes == 1) {
m.put(propName, methods[i]);
}
}
}
}
return m;
}
Tal vez puedas usar esto para hacer tu propio.
Editar: por supuesto, el generador de la reflexión en la respuesta de Aaron Digulla es mucho mejor que mi trabajo.