Я написал отображение JAXB, которое сохранило подсписок внутри корневого элемента в LinkedHashMap<String, Object>
вместо Collection<Object>
, поддерживаемом через определенный XmlJavaTypeAdapter
. Ниже приведен образец:
@XmlRootElement
public class Parent {
@XmlJavaTypeAdapter(ListToMapAdapter.class)
@XmlElement
private LinkedHashMap<String, Child> children;
...
}
Ключ строится из атрибутов дочернего тега (например, <child id="key">
дает Map.Entry<String, Child>
, как {key => child}
.
Один из моих коллег говорит, что он плохо спроектирован, и что этот Map
должен быть в объекте, отвечающем за демонтаж XML. Я не согласен с ним. Вот некоторые плюсы и минусы такого подхода. Какой дизайн вы считаете лучшим? И какие плюсы и минусы вы видели, чтобы завершить дискуссию?
Цель данного проекта:
-
Map
дает возможность эффективно искать детей с критериями (ключ в моем образце) вместо поиска по итерации в Collecion.
Плюсы:
- Ответственность за поиск и фильтрацию подсписка находится ближе всего к объекту, а родительский объект отвечает за извлечение и фильтрацию его дочернего элемента,
- Построение
Map
автоматически выполняется JAXB при демаршаллинге: элегантный, эффективный и не позволяет построить Map
с последующей обработкой списка после umarshalling (итерация) ,
- один и тот же объект в разных читателях все еще имеет возможность фильтрации своих потомков,
- субъективно, это действительно красивый способ сделать это :),
- , если
@XmlJavaTypeAdapter
существует, это отчасти для этого (многочисленные примеры этого в Интернете).
Минусы (некоторые от моего коллеги) :
- Ограничения ограничения JAXB для кода конкретной реализации вместо интерфейса: не удалось объявить
Map<String, Child>
в моем примере (не может быть создан JAXB во время демаршаллинга),
- может быть (и это аргумент моего коллеги), это не роль отображающего объекта (по его словам, простой POJO), чтобы иметь такое поведение,
@XmlJavaTypeAdapter
предназначен только для преобразования простого объекта в определенные типы: xs:date
во время Joda *, например, 1059 *.
Заранее благодарим за ваши 2 цента.