Убедиться, что один и тот же объект не загружается дважды из XML API в Java - PullRequest
1 голос
/ 23 апреля 2011

Я новичок в Java и работаю над Java-приложением Public Transit в качестве первого небольшого проекта.

Я загружаю транзитные данные с сервера через XML API (используя DOM XML API).Поэтому, когда вы вызываете конструктор, скажем, BusStop (int id), конструктор загружает информацию об этой остановке с сервера на основе предоставленного идентификатора.Итак, меня интересует пара вещей: как я могу убедиться, что я не создаю экземпляры двух объектов BusStop с одинаковым идентификатором (я просто хочу один объект для каждого BusStop)?

Также у кого-нибудь есть рекомендации по загрузке объектов, поэтому мне не нужно загружать всю базу данных каждый раз, когда я запускаю приложение, только BusStop и соответствующие объекты Arrivals и BusTrips для этогостоп?Ранее я занимался программированием на C ++ и MVC PHP, но не имел опыта загрузки большого количества объектов с помощью циклических ссылок на объекты и т. Д.

Спасибо!

Ответы [ 3 ]

1 голос
/ 23 апреля 2011

Для этого приложения я бы использовал следующие технологии Java EE: JAX-RS, JPA и JAXB.Вы найдете, что эти технологии включены почти в каждый сервер приложений Java (например, GlassFish ).

JPA - API персистентности Java

Предоставляет простые средствапреобразования ваших объектов в / из базы данных.С помощью аннотаций вы можете пометить отношения как ленивые, чтобы предотвратить чтение всей базы данных.Также благодаря использованию кэширования доступ к базе данных и создание объектов сокращены.

JAXB - Java-архитектура для привязки XML

Предоставляет простые средства для преобразования ваших объектов в / изXML.Реализация включена в Java SE 6.

JAX-RS - Java API для RESTful Services

Предоставляет простой API (через HTTP) для взаимодействия с XML.

Пример

Вы можете посмотреть пример, который я разместил в своем блоге:

1 голос
/ 23 апреля 2011

Я бы не стал запускать процесс загрузки / десериализации в конструкторе. Я написал бы класс менеджера для каждого типа сущности с методом для извлечения объекта Java для данной сущности на основе его идентификатора. Используйте HashMap с типом ключа в качестве идентификатора вашей сущности и типом значения в качестве класса Java для этого объекта. Менеджер будет единственным, использующим ваш предпочтительный шаблон (я бы, вероятно, использовал статические элементы для простоты).

Первое, что должен сделать метод fetch, - это проверить карту, чтобы увидеть, содержит ли она запись для данного идентификатора. Если он уже получил и построил этот объект, верните его. Если это не так, извлеките объект из удаленной службы, десериализуйте объект соответствующим образом, загрузите его в HashMap по указанному идентификатору и верните его.

Что касается ссылок на другие объекты, я предлагаю вам представлять их как идентификаторы в ваших объектах Java, а не сохранять их как ссылки на объекты Java и десериализовать их одновременно с ссылочным объектом. Приложение может лениво создавать экземпляры этих объектов по запросу через соответствующего менеджера. Это уменьшает проблемы с помощью циклических ссылок.

Если объем данных может превысить доступную оперативную память на вашей виртуальной машине Java, вам следует периодически удалять старые объекты с карты, чтобы восстановить память (уверен, что они будут перезагружены при необходимости).

0 голосов
/ 23 апреля 2011

Для классов, которые вы хотите загрузить только один раз для данного идентификатора, используйте какой-либо шаблон проектирования Factory.Внутренне вы можете сохранить идентификатор для отображения экземпляра на карте.Перед фактическим получением данных с сервера сначала выполните поиск на этой карте, чтобы увидеть, загружен ли уже класс для этого идентификатора.Если нет, тогда продолжайте извлекать и обновлять карту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...