Javolution kütüphanesinin XML serialize / deserialize işlemlerinden daha önce bahsetmiştim. Ancak orada da dikkat edeceğiniz üzere, bir sınıfın özelliklerini okurken, sınıfın boş constrcutor ile oluşturulması ve her elemanın (primitve type olmayan) initialize edilmiş olması gerektiğinden bahsetmiştik. Ancak bu durum bazı koşullar altında gerçeklenemeyebilir. Örneğin, enum bir sınıfa uygulayamazsınız. Çünkü sınıfın baştan öncelikle initialize olması gerek. Enum bir sınıfta ise, zaten tüm işlem o initialize anında olmaktadır. Örneğin aşağıdaki enum sınıfını ele alırsak;

public enum MyEnum {
    RIGHT, LEFT, TOP, BOTTOM
}

Javolution bu sınıfa uygun olarak gerçeklenemez. Çünkü initialize etmeniz gerek ve eğer siz RIGHT olarak initialize ettiyseniz, onu daha sonradan LEFT olarak atayamazsınız. Çünkü read metoduna zaten initialize edilmiş nesne gelecektir. Yani kurgu tamamen sınıfın boş constructor ile oluşturulup daha sonra içerideki elemanların sırayla oluşturulmasından geçer.

Ancak bunu kırmanın bir yolu mevcut. Şöyle ki; hali hazırda XMLFormat sınıfını yazdıktan sonra, read ve write olmak üzere iki adet abstract metodu yazmanız gerek. Ama XMLFormat sınıfının içerisinde bir metot daha mevcut. O da newInstance metodu;

public T newInstance(Class <T>cls, InputElement xml) throws XMLStreamException;

Bu metot’da, o boş constructor ile nesne oluşturan kısım. Ancak dikkat edeceğiniz gibi bu metoda da InputElement nesnesi gelmektedir. Yani XML’e ait olan verileri bu metot içerisinde de okuyabiliriz. Örnek vermek gerekirse yukarıdaki enum sınıfı için;

public enum MyEnum {

    RIGHT, LEFT, TOP, BOTTOM;

    static final XMLFormat XML = new XMLFormat(MyEnum.class) {
        public MyEnum newInstance(Class<MyEnum> cls, InputElement xml) throws XMLStreamException {
            return MyEnum.valueOf(xml.getAttribute("toStr", ""));
        }

        public void write(MyEnum myEnum, OutputElement xml) throws XMLStreamException {
            xml.setAttribute("toStr", myEnum.toString());
        }

        public void read(InputElement xml, Point point) throws XMLStreamException { }
    };

}

Yukarıda da görüleceği üzere, sınıfn yeni örneğini kendimiz yaratarak boş constructor ile oluşturulmasının önüne geçebiliyoruz.