Hola, oyente por primera vez oyente por primera vez, y estoy haciendo una pregunta relacionada con la reflexión de Java, y qué fácil se presta a una codificación aparentemente desagradable. El siguiente método intenta tomar dos objetos similares (un objeto que tiene todos los campos del otro objeto, y algunos) y compararlos para la igualdad. Será (supuestamente) devuelto verdadero si los captadores que los objetos comparten son iguales, y devolverá falso si no son iguales.Uso eficaz de la reflexión de Java: ¿se trata de un truco, o es esta práctica estándar?
public boolean validateArchive(Object record, Object arcRecord) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
{
log.debug(record.getClass().toString());
Object methodValue;
Object arcMethodValue;
for (Method method : record.getClass().getMethods())
{
if (method.getTypeParameters().length == 0 && method.getName().startsWith("get") && !method.getName().startsWith("getClass"))
{
methodValue = method.invoke(record);
arcMethodValue = arcRecord.getClass().getMethod(method.getName()).invoke(arcRecord);
log.debug("Method name: " + method.getName());
log.debug("Archive value: " + arcMethodValue);
log.debug("Object value: " + methodValue);
if (arcMethodValue != null && methodValue != null && !arcMethodValue.equals(methodValue))
{
return false;
}
else
{
if (arcMethodValue == null && methodValue != null || methodValue == null && arcMethodValue != null)
{
return false;
}
}
}
}
return true;
}
Este método hace lo que se espera que haga en las pruebas de unidad, pero se ve feo, y se siente mal (yo particularmente no soy un fan de la anidada 'si'). Solo esperaba algunos consejos sobre cómo hacer esto de manera más efectiva/eficiente. Si he roto algún tipo de regla de publicación, no dude en corregirme, estoy ansioso por aprender, etc.
Primera observación: ni siquiera comprueba si los dos objetos son de la misma clase. Su arcMethod bien podría estar ausente de su objeto de archivo. –
No se supone que sean de la misma clase, pero supongo que supongo que el usuario del método es lo suficientemente inteligente como para pasar dos objetos similares (la entidad en sí, y luego la entidad de archivo de ese mismo objeto es el uso previsto) . Lo que podría hacer es validar que los dos objetos son de hecho objeto + archivo de objeto comparando nombres de clase, pero que se siente aún más pirateado. Quizás no lo sea. –