Обратная совместимость - не единственная причина. : -Р
С более сложными схемами, например, со сложными ограничениями на значения, которые может принимать содержимое элемента, иногда вам нужно создавать реальные JAXBElement
объекты. Их обычно нетривиально создавать вручную, поэтому методы create*
делают тяжелую работу за вас. Пример (из схемы XHTML 1.1):
@XmlElementDecl(namespace = "http://www.w3.org/1999/xhtml", name = "style", scope = XhtmlHeadType.class)
public JAXBElement<XhtmlStyleType> createXhtmlHeadTypeStyle(XhtmlStyleType value) {
return new JAXBElement<XhtmlStyleType>(_XhtmlHeadTypeStyle_QNAME, XhtmlStyleType.class, XhtmlHeadType.class, value);
}
Вот как вы получаете тег <style>
в тег <head>
:
ObjectFactory factory = new ObjectFactory();
XhtmlHtmlType html = factory.createXhtmlHtmlType();
XhtmlHeadType head = factory.createXhtmlHeadType();
html.setHead(head);
XhtmlStyleType style = factory.createXhtmlStyleType();
head.getContent().add(factory.createXhtmlHeadTypeStyle(style));
Первые три использования ObjectFactory
можно считать излишними (хотя и полезными для согласованности), но четвертое делает JAXB намного, намного проще в использовании. Воображение о необходимости каждый раз писать new JAXBElement
вручную!