java примеры - В чем смысл классов ObjectFactory JAXB 2?




руководство хабр (4)

Обратная совместимость, я думаю ...

http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :

... Больше нет ObjectFactory.createXYZ. Проблема с этими заводскими методами заключалась в том, что они бросают проверенное исключение JAXBException. Теперь вы можете просто создавать новые XYZ (), больше не блокировать try / catch. (Я знаю, я знаю, это одно из тех, «что мы думаем!») ...)

Я новичок в использовании JAXB, и я использовал xjc JAXB 2.1.3 для создания набора классов из моей XML-схемы. Помимо создания класса для каждого элемента в моей схеме, он создал класс ObjectFactory.

Кажется, что мне ничего не мешает прямому экземпляру элементов, например

MyElement element = new MyElement();

в то время как учебники, похоже, предпочитают

MyElement element = new ObjectFactory().createMyElement();

Если я посмотрю на ObjectFactory.java, я вижу:

public MyElement createMyElement() {
    return new MyElement();
}

так в чем дело? Почему я должен даже поддерживать класс ObjectFactory? Я предполагаю, что он также будет перезаписан, если я буду перекомпилировать из измененной схемы.


Как отметил @Chris, иногда JAXB не может работать с POJO, потому что схема не может быть точно сопоставлена ​​с Java. В этих случаях JAXBElement оболочки JAXBElement необходимы для предоставления дополнительной информации о типе.

Есть два конкретных примера, с которыми я столкнулся, где это распространено.

  • Если вы хотите @XmlRootElement объект класса, который не имеет аннотации @XmlRootElement . По умолчанию XJC генерирует только @XmlRootElement для некоторых элементов, а не для других. Точная логика для этого немного сложна, но вы можете заставить XJC генерировать дополнительные классы @XmlRootElement используя «простой режим привязки»,

  • Когда ваша схема использует группы заместителей. Это довольно продвинутое использование схемы, но XJC переводит группы подстановки на Java, сильно используя обертки JAXBElement .

Таким образом, в XJC-сгенерированной объектной модели, которая сильно использует JAXBElement (по какой-либо причине), вам нужен способ создания этих экземпляров JAXBElement . Созданный ObjectFactory - самый простой способ сделать это. Вы можете сами их построить, но это неудобно и подвержено ошибкам.


Обратная совместимость - не единственная причина. :-П

С более сложными схемами, такими как те, которые имеют сложные ограничения на значения, которые может содержать содержимое элемента, иногда вам нужно создать реальные объекты 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 изображений, чтобы каждый раз писать new JAXBElement вручную!


Разница между статическим и нестационарным вложенным классом в Java

1) Вложенный статический класс не требует ссылки на класс Outer, но нестатический вложенный класс или класс Inner требует ссылки на внешний класс. Вы не можете создать экземпляр класса Inner без создания экземпляра класса Outer. Это, безусловно, самое важное, что нужно учитывать при создании вложенного класса статического или нестатического.

2) статический класс является фактически статическим членом класса и может использоваться в статическом контексте, например, статический метод или статический блок класса Outer.

3) Еще одно отличие статического и нестатического вложенного класса заключается в том, что вы не можете напрямую обращаться к нестационарным членам, например методу и полю, в вложенный статический класс. Если вы это сделаете, вы получите ошибку, так как «нестатический член не может использоваться в статическом контексте». В то время как класс Inner может обращаться к статическому и нестационарному члену класса Outer.

public class OuterClass {
    private static String message = "Hello JAVA";

    // How to create instance of static and non static nested class
    public static void main(String... args) {

        // creating instance of nested Static class
        InnerClassStatic printer = new InnerClassStatic();

        //calling non static method of nested static class
        printer.printMessage();

        // creating instance of non static nested class or InnerClass class
        // In order to create instance of InnerClass class you need an OuterClass class instance
        OuterClass outerClass = new OuterClass(); //outerClass class instance for creating non static nested class

        InnerClass innerClass = outerClass.new InnerClass();
        innerClass.display();  //calling non static method of InnerClass class

        // we can also combine above steps in one step to create instance of InnerClass class
        InnerClass nonStaticIner = new OuterClass().new InnerClass();

        nonStaticIner.display(); // similarly you can now call InnerClass class method
    }


    // Static nested class
    private static class InnerClassStatic {
        //Only static member of OuterClass class is directly accessible in nested static class

        public void printMessage() {
            // Compile time error if message field is not static
            System.out.println("Message from nested static class : " + message);
        }
    }

    //non static nested class - also called InnerClass class
    private class InnerClass {

        // Both static and non static member of OuterClass class is accessible in this InnerClass class
        public void display() {
            System.out.println(" Message from non static nested or InnerClass class : " + message);
        }
    }
}

Выход:

Message from nested static class : Hello JAVA
Message from non static nested or Inner class : Hello JAVA
Message from non static nested or Inner class : Hello JAVA

Все это на разнице между Static и non Static вложенным классом в Java. До сих пор мы затрагивали только членский класс Inner и не обсуждали другие два типа в классе Inner, например, Local class и Anonymous Inner. В этом учебнике Java мы видели, что представляет собой вложенный статический класс в Java и как создать экземпляр как вложенного статического, так и нестатического класса в Java.

В итоге его легко создать экземпляр вложенного статического класса, так как он не требует экземпляра класса Outer, в то время как нестатический вложенный класс, например, класс Inner всегда будет иметь экземпляр класса Outer и не может существовать без класса Outer. Если вам нужно выбирать между static vs non static class, чем использовать статический вложенный класс, если вы можете его использовать.





java jaxb