2011-11-14 16 views
11

Si consideri che ho un fagiolo standard di Java: vale a dire che contiene i membri che sono String, List, HashMap, eccRileva se un oggetto Java è stato modificato?

La mia domanda è: qual è il modo più semplice per rilevare se un'istanza di un tale oggetto è stato modificato da dire uno stato precedente/originale?

Il motivo per cui voglio sapere questo è così ho determinato se dovrei aggiornare l'oggetto nel DB, o meno, nel caso in cui: (i) non sono state apportate modifiche, o (ii) sono state apportate modifiche ma poi invertito.

Ho pensato al confronto di hashCode o byte [], ma non sembra funzionare. Qualche idea?

+0

È passato un po 'di tempo - forse potresti accettare una risposta? – Bohemian

risposta

4

se si dispone di setter, notificare un elenco di listener in questo setter se è impostato un nuovo valore.

+0

Come addizione in questo thread molto vecchio per aiutare gli altri a venire da Google: questo non funziona perché non sarebbe stata rilevata una modifica "nulla", ad es. setString ("newString") + setString (oldValue) non cambierebbe nulla ma seguendo il metodo si ottiene un avviso positivo – alex

+0

@alex Sì, è giusto così. Ma è una questione di definizione. Dopo aver chiamato 'setString (" newString ")' lo stato dell'oggetto è decisamente cambiato, quindi può essere valido per notificare un listener. Forse vuoi mantenere l'oggetto ogni volta che cambia? Che tu possa cambiare la stringa di nuovo al vecchio valore, eventualmente in futuro, può essere importante. Ma non è necessario. È una questione del tuo caso d'uso. –

+0

Ok, certo, l'oggetto è cambiato. Ma avevo in mente che alcune app notificano uno stato modificato, nonostante lo stato originale sia già stato ripristinato. Per definizione è stata effettuata una manipolazione ma non è logico/utile rilevare una modifica in quel caso per tutte le situazioni – alex

4

Lo stesso problema era lo ibernare gli sviluppatori e lo hanno risolto creando proxy per le entità restituite. Il proxy registra ogni chiamata setter e quindi determina se l'entità è cambiata.

7

Sì, può essere fatto, ed è è stato fatto ... si chiama hibernate. Basta usare quello e non "reinventare la ruota"

+1

Puoi fornire un piccolo dettaglio su di esso o un riferimento più specifico di qualsiasi sito. –

2

Poiché si utilizzano le convenzioni JavaBeans, sarebbe meglio che i setter aggiornino un po 'di flag se vengono chiamati con un argomento diverso dal target valore attuale del campo. Se hai bisogno di scoprire se due o più chiamate portano a un cambiamento effettivo (ad esempio A-> B-> A non cambia), allora diventa più complesso. Non sono sicuro che ne varrà la pena.

Si potrebbe voler utilizzare Java Persistance API (JPA), che è molto meglio per questo tipo di cose. Può essere utilizzato anche al di fuori del contesto Java EE, in semplici app Java SE. È un po 'più lavoro lì, dal momento che dovrai occuparti dei commit e dei rollback delle transazioni, ma l'API si rivelerà comunque molto utile.

Problemi correlati