2011-11-14 27 views
11

Considere que tengo un grano estándar de Java: es decir, que contiene miembros que son String, List, HashMap, etc.¿Detecta si se ha modificado un objeto Java?

Mi pregunta es: ¿cuál es la forma más fácil de detectar si una instancia de un objeto, ha sido modificado de decir un estado anterior/original?

La razón por la que quiero saber esto es para determinar si debo actualizar el objeto en el DB, o no, en el caso de que: (i) no se realizaron cambios, o (ii) se hicieron cambios, pero luego invertido.

He estado pensando en comparación de hashCode, o byte [], pero no parece funcionar. ¿Algunas ideas?

+0

Ha sido un tiempo - tal vez usted podría aceptar una respuesta? – Bohemian

Respuesta

4

si tiene definidores, notificar a una lista de oyentes en este set si se ha establecido un nuevo valor.

+0

Como complemento en este hilo muy viejo para ayudar a otros que vienen de Google: Eso no funciona porque no se detectaría un cambio "nulo", p. setString ("newString") + setString (oldValue) no cambiaría nada, pero después de su método se obtiene una alerta positiva – alex

+0

@alex Sí, eso es de alguna manera correcta. Pero es una cuestión de definición. Después de llamar a 'setString (" newString ")', el estado del objeto ha cambiado definitivamente, por lo que puede ser válido para notificar a un oyente. Tal vez quieras persistir el objeto cada vez que cambie? Volver a cambiar la cadena al valor anterior en el futuro puede ser importante. Pero no es necesario. Es una cuestión de tu caso de uso. –

+0

Ok seguro, el objeto ha cambiado. Pero tenía en mente, que algunas aplicaciones notifican sobre un cambio de estado, a pesar de que el estado original ya está restaurado. Por definición, se ha realizado una manipulación pero no es lógica/útil para detectar una modificación en ese caso para todas las situaciones. – alex

4

El mismo problema tenía hibernate desarrolladores, y lo han solucionado creando proxies para las entidades devueltas. El proxy registra cada llamada de establecimiento y así determina si la entidad ha cambiado.

7

Sí, se puede hacer, y ha sido hecho ... se llama hibernate. Simplemente use eso y no "reinvente la rueda"

+1

¿Podría darnos un pequeño detalle al respecto o una referencia más específica de cualquier sitio? –

2

Dado que está utilizando las convenciones de JavaBeans, sería mejor que sus instaladores actualicen alguna bandera si se invocan con un argumento diferente del objetivo valor actual del campo Si necesita saber si dos o más llamadas producen un cambio real (por ejemplo, A-> B-> A no cambia), se vuelve más complejo. No estoy seguro de que valga la pena.

Es posible que desee utilizar la API Java Persistence (JPA), lo cual es mucho mejor para este tipo de cosas. También se puede usar fuera del contexto de Java EE, en aplicaciones Java SE sencillas. Es un poco más trabajo allí, ya que tendrás que encargarse de las transacciones comprometidas y de las reversiones, pero la API será muy útil de todos modos.

Cuestiones relacionadas