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