шаблоны обновления отдельных коллекций Java - PullRequest
1 голос
/ 12 сентября 2010

У меня есть класс, например MyDataClass.У меня есть HashMap<String,MyDataClass> myMap; Для каждой ссылки в myMap, у меня также есть некоторые другие ссылки MyDataClass на тот же объект.А именно:

MyDataClass c = new MyDataClass();
//configure c object with appropriate values
myMap.put("akeyvalue",c);
MyDataClass ref = c;

На этом этапе ref и myMap.get("akeyvalue") относятся к одному и тому же объекту в памяти.Если позже я сделаю myMap.remove("akeyvalue"), запись в хэш-карте будет удалена, но объект ref все равно будет ссылаться на то же место.По существу значение myMap.get("akeyvalue") все еще существует.Как я могу обновить его до нуля, чтобы он был синхронизирован с hashmap?Т.е. если у меня есть разные структуры данных / коллекции, которые ссылаются на одни и те же объекты, какой шаблон / дизайн лучше всего использовать для их синхронизации?В моем небольшом примере в коде, который я удаляю на myMap, у меня нет доступа к ref объекту.Я должен как-то найти ref и обнулить его.Как правило, у меня может быть структура данных округа, например List<MyDataClass> refs;

Спасибо

Ответы [ 4 ]

0 голосов
/ 12 сентября 2010

Я бы согласился с Божо - подклассом HashMap и добавил бы способ добавить слушателей в ваш новый класс. Переопределите clear() и remove() для вызова onDelete(Object o) в вашем слушателе.
Когда другие объекты хотят знать, когда что-то было удалено, просто зарегистрируйте слушателя с помощью HashMap и реализуйте метод onDelete(Object o), а затем заранее сообщите об этом.

0 голосов
/ 12 сентября 2010

Хм, я думаю, у вас есть неправильные идеи, которые задают ваш вопрос. Во-первых, после того как вы удалили «akeyvalue» из коллекции, вы не сможете получить к нему доступ через карту. Не имеет значения, существует ли другая переменная, ссылающаяся на исходное значение, или нет.

Во-вторых, если вы, как разработчик, хотите сохранить несколько ссылок на один и тот же объект, вам нужно спроектировать программное обеспечение, чтобы очистить все ссылки на него, уменьшить его счетчик ссылок до нуля и позволить сборщику мусора восстановить объем памяти. Например, наличие ссылки на один и тот же объект на карте доступных объектов и карте использованных объектов является практическим примером нескольких карт. Вы должны поддерживать их.

В вашем примере вам не нужно очищать ref. Просто, потому что он будет автоматически очищен в конце текущего метода. То, что вы спрашиваете, - это то, что мы делаем в таких целях, как объективная разработка iphone, но не нужно в разработке java.

0 голосов
/ 12 сентября 2010

"Если у меня есть разные структуры данных / коллекции, которые ссылаются на одни и те же объекты, какой шаблон / дизайн лучше всего использовать для их синхронизации?"

Я считаю, что ответом является инкапсуляция . Если вы храните связанные структуры данных в одном классе с понятным API, то любое действие, доступное API, может их обновлять и синхронизировать. Эти структуры данных должны быть скрыты; таким образом вы гарантируете, что любой доступ к ним контролируется инкапсулирующим классом.

0 голосов
/ 12 сентября 2010

Вам придется сделать это вручную. Если вы хотите, чтобы remove(..) в одной коллекции влиял на другую:

  • расширение HashMap (или любая коллекция)
  • сделать private Collection anotherCollection с сеттером и геттером в вашем классе
  • переопределить remove(..), позвонить super.remove(..), а также позвонить anotherCollection.remove(..)
...