2011-11-14 2 views
11

Считают, что у меня есть стандартный Java-компонент: то есть он содержит элементы, которые String, List, HashMap и т.д.Определить, был ли изменен объект Java?

Мой вопрос: что это самый простой способ определить, если экземпляр такого объекта было изменено, скажем, предыдущее/исходное состояние?

Причина, по которой я хочу знать это, поэтому я определяю, должен ли я обновлять объект в БД, или нет, в случае, когда: (i) никаких изменений не было сделано или (ii) внесены изменения, но затем наоборот.

Я думал о сравнении hashCode или байт [], но, похоже, не работает. Есть идеи?

+0

Прошло некоторое время - возможно, вы могли бы принять ответ? – Bohemian

ответ

4

Если у вас есть сеттеры, сообщите о списке слушателей в этих сеттерах, если установлено новое значение.

+0

Как добавление в эту очень старую нить, чтобы помочь другим приходить в Google: это не работает, потому что «нулевой» обмен не будет обнаружен, например. setString ("newString") + setString (oldValue) ничего не изменит, но после вашего метода вы получите положительное предупреждение – alex

+0

@alex Да, это как-то правильно. Но это вопрос определения. После того, как вы вызвали 'setString (« newString »), состояние объекта определенно изменилось, поэтому оно может быть действительным для уведомления слушателя. Может быть, вы хотите сохранить объект в любое время? То, что вы измените строку на прежнее значение в будущем, может быть важным. Но это не обязательно. Это вопрос вашего прецедента. –

+0

Хорошо, объект изменился. Но я имел в виду, что некоторые приложения уведомляют об изменении состояния, несмотря на то, что исходное состояние уже восстановлено. Для определения было сделано манипулирование, но его нелогично/полезно для обнаружения модификации в этом случае для всех ситуаций. – alex

4

У этой проблемы была hibernate разработчиков, и они справились с ней, создав прокси для возвращенных объектов. Прокси регистрирует каждый вызов сеттера и поэтому определяет, изменилась ли сущность.

7

Да, это можно сделать, и это было сделано ... это называется hibernate. Просто используйте это и не «изобретайте велосипед»

+1

Не могли бы вы дать небольшую информацию об этом или более конкретную ссылку на любой сайт. –

2

Поскольку вы используете соглашения JavaBeans, было бы лучше, если бы ваши сеттеры обновили некоторый флаг, если они вызываются с аргументом, отличным от целевого текущее значение поля. Если вам нужно выяснить, приводит ли к двум или более вызовам фактическое изменение (например, A-> B-> A не изменяет), тогда он становится более сложным. Я не уверен, что это стоило бы накладных расходов.

Возможно, вы захотите использовать Java Persistance API (JPA), который намного лучше подходит для такого рода материалов. Он также может использоваться вне контекста Java EE, в простых приложениях Java SE. Там немного больше работы, так как вам нужно позаботиться о транзакционных фиксациях и откатах, но API окажется очень полезным в любом случае.

Смежные вопросы