Kann JAXB generieren ArrayList statt List?
<complexType name="BookShelf">
<sequence>
<choice minOccurs="0" maxOccurs="unbounded">
<element name="newBook" type="string"/>
<element name="oldBook" type="string"/>
</choice>
</sequence>
</complexType>
JAXB erzeugt die Eigenschaft als List<JAXBElement<String>>
. Gibt es eine Möglichkeit, es kann erzeugt werden als ArrayList?
- Warum? JAXB erzeugt eine Art von API aus dem schema. Eine API sollte nicht enthalten die konkreten Klassen. ArrayList hat nur eine öffentliche Methode, die mehr als Liste: trimToSize () ist das wichtig für Sie? Übrigens: der generierte code erstellt eine ArrrayList Instanzen in lazy-Getter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum, was würde dir das bringen?
ArrayList<E>
hat keine öffentlichenMethoden, die nicht in der
List<E>
Schnittstelle, so gibt esnichts, was Sie tun könnten, mit der
ArrayList<E>
dass Sie nicht tun konntemit anderen
List<E>
(eigentliches ist ein:
ArrayList.trimToSize()
,danke @Joachim Sauer, aber es ist
kaum jemals benötigt).
akzeptieren oder zurückgeben Umsetzung
Typen anstelle der zugrunde liegenden
- Schnittstellen. Ich würde vorschlagen, Sie zu
Folgen Sie den Sammlungen Trail von
die Sun-Java-Tutorial und /oder Lesen
Effektive Java von Joshua Bloch
(Sie erhalten eine Vorstellung von dem, was er
reden aus dieser kurzen
Album Vorhören, die die Quelle von dem Zitat unten), um mehr zu erfahren über die
Collections-framework und interface
- Nutzung.
die Umsetzung ist nicht
ArrayList
?ArrayList
ist dieHäufig verwendete Liste Umsetzung
wie auch immer, so sind die Chancen hoch, dass
JAXB wird eigentlich zurückgeben
ArrayList
es einfach nicht sagen Sieso (weil Sie nicht zu wissen brauchen).
Element 52: Beziehen sich auf Objekte, die durch Ihre Schnittstellen (Auszug)
[ ... ]
Quelle: Effektive Java, Vorschau auf SafariBooksOnline.
trimToSize()
erwähnt, von Arne oben).Standardmäßig die Eigenschaft einer Liste und der zugrunde liegenden Implementierung wird eine ArrayList. Natürlich können Sie JAXB Anpassungen an eine änderung der zugrunde liegenden Implementierung, oder verwenden Sie Ihre eigene Klasse mit einer Eigenschaft vom Typ ArrayList (obwohl aus den genannten Gründen in anderen Antworten dieser ist selten eine gute Idee).
Standard JAXB Generation
Angesichts Ihrer XML-Schema:
Mithilfe der folgenden Befehlszeile:
JAXB generiert die folgende Klasse:
Anpassen der Generation
Standardmäßig JAXB wird die Art der Immobilie eine Liste mit den zu Grunde liegenden Implementierung ArrayList. Wenn Sie Steuern möchten, die zugrunde liegenden Implementierung können Sie eine externe verbindlich-Datei wie:
Und die folgenden XJC aufrufen:
Erhalten die folgende Klasse statt:
Mit Ihrer eigenen Klasse:
Können Sie auch Ihre eigene Klasse mit einer Eigenschaft vom Typ ArrayList (obwohl aus den genannten Gründen in anderen Antworten dieser ist selten eine gute Idee).
Weitere Informationen:
Können Sie ' T ändern die Tatsache, dass die API generiert eine Liste.
Allerdings davon aus, dass die zugrunde liegende Implementierung tatsächlich erzeugt ein ArrayList-Sie können immer nur gegossen, es zu einer ArrayList:
Oder wenn es nicht arraylist (d.h. Sie erhalten eine Ausnahme, die versuchen die oben...), generieren Sie eine neue ArrayList, welche die gleichen Elemente in der Liste.
Im Allgemeinen jedoch sollten Sie nicht brauchen, um jedes dieser: es ist immer besser, auf code für ein interface die Abstraktion eher als die zugrunde liegende konkrete Klasse, Wann immer Sie können.
instanceof
überprüfen.