Ситуация
Я использую реализацию MOXy JAXB для работы с большим XML-документом, схема которого имеет много схожих сложных типов. В частности, существует около двух десятков типов, которые действуют как элементы-оболочки списка со следующей структурой:
<ITEMS attr1="X" attr2="Y">
<ITEM>...</ITEM>
...
<EXTENSION/>
<ITEMS>
Для каждого из этих элементов, подобных оболочке -списка -, изменяется имя и изменяется содержащийся элемент списка. Однако атрибуты (, которые являются необязательными ), и единственный элемент EXTENSION (, также необязательный ), всегда присутствуют. Вот пример использования двух типов:
<ROLES visible="false">
<ROLE type="X"/>
<ROLE type="Y"/>
</ROLES>
<PAYMENTS visible="true">
<PAYMENT>
<PAYEENAME>Joe</PAYEENAME>
</PAYMENT>
<EXTENSION>
<SOMETHING>Here</SOMETHING>
</EXTENSION>
</PAYMENTS>
Вопрос
Я хотел бы избежать дублирования кода, поскольку единственное, что меняется между этими элементами, — это имя и еще один -или -элемент, который он содержит. Как лучше всего это сделать?
Я вижу только два возможных решения.
1
Создание конкретного класса с использованием дженериков для указания типа объекта, который будет использоваться в изменяемой коллекции. Затем используйте внешние OX-сопоставления MOXy, чтобы указать, как следует сериализовать любое отдельное использование класса. Что-то вроде:
public class GenericContainer<T> {
@XmlAttribute
protected Boolean visibile;
@XmlElement(name = "Extension")
protected Extension extension;
// OX Mappings done in external meta file
protected List<T> items;
...
}
Хотя мне нравится этот вариант, похоже, невозможно переопределить сопоставления OX класса для каждого -использования.
2
Создание базового класса без свойства List, а затем создание одного конкретного класса для каждого пользовательского элемента-оболочки. Это решение определенно работает, но в итоге я получу примерно две дюжины почти -идентичных классов.
Возможно ли #1, или есть лучший способ справиться с этим, о котором я не подумал?
Заранее спасибо!