Проверка того, что один и тот же объект не загружается дважды из XML API в Java

#java #xml #api #object

#java #xml #API #объект

Вопрос:

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

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

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

Спасибо!

Ответ №1:

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

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

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

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

Комментарии:

1. Очень полезный ответ для кого-то, кто не знаком с Java! Большое спасибо: D

2. Рад помочь. Удачи с вашим приложением.

Ответ №2:

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

JPA — Java Persistence API

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

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

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

JAX-RS — Java API для RESTful Services

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

Пример

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

Комментарии:

1. Это выглядит немного излишним для того, над чем я сейчас работаю, но спасибо за отличный ответ! Я уверен, что это будет полезно в будущем и для других.

2. @Russell — Это звучит как перебор, но на самом деле это всего лишь несколько аннотаций к паре классов.

Ответ №3:

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