InPUT предлагает способ, если вы хотите гибкое решение на основе описания. Я создал весь пример и добавил его в раздел example .
Код минимален с:
Design config = new Design("config.xml");
ListCreator creator = config.getValue("ListCreator");
при условии, что у вас есть config.xml InPUT design , который содержит настройки в синтаксисе InPUT:
<SValue id="ListCreator">
<NValue id="SortDescending" value="false"/>
<SValue id="TableWriter" value="Xls"/>
</SValue>
Чтобы это работало, вы должны определить расчетное пространство следующим образом:
<SParam id="ListCreator">
<NParam id="SortDescending" type="boolean" />
<SParam id="TableWriter">
<SChoice id="Xls"/>
<SChoice id="Pdf"/>
</SParam>
</SParam>
Теперь вы приспосабливаете пространство разработки, независимое от языка программирования, к вашей реализации Java в сопоставлении кода :
<Mapping id="ListCreator" type="test.ListCreator" constructor="TableWriter SortDescending"/>
<Mapping id="ListCreator.TableWriter" type="test.TableWriter"/>
<Mapping id="ListCreator.TableWriter.Xls" type="test.XlsTableWriter"/>
<Mapping id="ListCreator.TableWriter.Pdf" type="test.PdfTableWriter"/>
Отсюда расширяйте и настраивайте по своему усмотрению, не касаясь кода. Вы упоминаете случай с несколькими экземплярами ListCreator. Вам нужно будет сделать 3 изменения:
1) расчетное пространство:
<SValue id="ListCreator" type="[]">
2) дизайн (например):
<SValue id="ListCreator">
<SValue id="1">
<NValue id="SortDescending" value="true"/>
<SValue id="TableWriter" value="Pdf"/>
</SValue>
<SValue id="2">
<NValue id="SortDescending" value="false"/>
<SValue id="TableWriter" value="Xls"/>
</SValue>
</SValue>
3) Будьте готовы получить вместо этого массив (код):
ListCreator[] creators = config.getValue("ListCreator");
Вы определяете количество и альтернативы в дескрипторе;
записи поступают в определенном порядке. Это работает аналогично для нескольких измерений (например, «[] [] []»). Вы можете добавить альтернативные средства записи таблиц с другими параметрами в будущем или изменить текущие параметры без изменений кода на стороне вызывающего. Просто убедитесь, что все классы доступны, и протестируйте это. Есть несколько источников ошибок (опечатки).