Sammlung vs-Liste vs-arrays als Rückgabetyp für EJB-Methode
Ich war vor kurzem gesagt, dass die Sammlung sollte bevorzugt werden, um Liste als Rückgabewert einer EJB-Methode. Das argument ist, dass im Allgemeinen Auflistung ist allgemeiner, d.h. Sie ändern die zugrunde liegenden Daten-Struktur-ohne Auswirkungen auf die Kunden. Und wenn dies ist die Flexibilität, die Sie haben wollen, als designer dann mit Auflistung machen besseres Gefühl. Aber dann würde es nicht mehr Sinn machen, gibt nur ein array anstelle der Sammlung?
Und was sind die Auswirkungen auf die Leistung wenn überhaupt?
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dann haben Sie in der Regel 4 Optionen:
List
,Set
,Collection
undIterable
. Es hängt davon ab, was ist die Semantik, die Sie einschließen möchten.Set
List
Collection
Iterable
(Hinweis: es gibt einige collection-Schnittstellen mit spezifischen Semantik:
Queue
,Deque
,Map
,Bag
,Multiset
, etc. - aber es wird ziemlich offensichtlich, wenn Sie brauchen, um Sie wieder)Collection
hat einesize()
Methode währendIterable
nicht, und es lohnt sich nicht, die Einschränkung des Kunden zu iterieren über eineIterable
nur um die Größe. So mein Neuzugang ist: "der Kunde braucht, um es zu ändernor will most probably need the size of it
".Sammlungen im Allgemeinen vorzuziehen sind über arrays, vor allem seit Java5, wo Sie gedreht wurden generische. Dies gibt Ihnen eine Art Sicherheit, und viele der möglichen zusätzlichen Funktionen, die nicht verfügbar sind in arrays (z.B. Set /Queue etc. Verhalten) - diese sind in der Tat nicht direkt vergleichbar zu arrays an alle. Unter den Sammlungen
ArrayList
ist die direkte Analogie zu einer array, und - umgesetzt auf eine array - seine Leistung ist vergleichbar mit einer nativen array.Als für die Sammlung vs-Liste (oder einige andere mehr spezifische Schnittstelle), ich persönlich würde es vorziehen die spezifische Oberfläche, wie die Eigenschaften und Verhaltensweisen, z.B. eine Liste vs eine Menge ist sehr unterschiedlich. In einer gut entworfenen Schnittstelle, die Sie wissen sollten (und angeben) im Voraus, ob Sie zurückkehren, z.B. ein Set, zu Entfernen oder die Liste. Wenn Sie eine Sammlung, die alle Ihre Kunden tun kann (abgesehen von hinzufügen/entfernen von Elementen) zu Durchlaufen, die möglicherweise nicht genug für Sie.
Meiner Meinung nach, mit einem
Collection
Gegensatz zu einer mehr spezifischen Oberfläche wie einList
oder eineSet
gemeint ist, absichtlich getan. Sie wäre mit derCollection
- interface für alle Fälle, in denen eine spezifische Schnittstelle erweitert dieCollection
- Schnittstelle, d.h. für wahr Sammlungen. Aber Sie können nicht tun das gleiche für andere Schnittstellen, wie eineMap
darstellen Zuordnungen eher als Sammlungen. Dies würde bedeuten, dass Ihre EJB-Schnittstelle signtaures sollte gedacht werden, sehr sorgfältig.Wie schon in der anderen Antwort von SJuan, wenn Sie die Absicht zur Rückkehr eine geordnete Sammlung, dann Sie muss mit einer
List
. Sie können dieses Dokument Verhalten des interface, aber das fehlt der Punkt; die Signatur der Methode sollten diese zu vermitteln. Beachten Sie auch, dassList
s kann Duplikate enthalten, so dass, wenn Sie beabsichtigen, um wieder eine Kollektion ohne Duplikate, macht es viel mehr Sinn, um wieder eineSet
statt einerList
oder eineCollection
. Um nochmals meine Meinung, die Sammlung zurückgegeben, die durch eine EJB-Methode sollte spiegeln die Eigenschaften der Sammlung genau so weit wie möglich, ohne Bezug auf einen konkreten Typ; Versuch, verlassen Sie sich auf die Dokumentation zu vermitteln, ist dies möglicherweise nicht die gewünschten Ergebnisse bei der Entwicklung von EJB-clients.Auf das Thema Arrays verwenden, würde ich empfehlen, Sie zu vermeiden, vor allem, arrays vom Typ
Object[]
. Es ist leicht zu missbrauchen diese, und konvertieren Sie Sie in schwach typisierten Daten-transfer-Objekte, dabei eine umfangreiche Dokumentation, wie jedes element des Arrays sollte verarbeitet werden. Der gleiche Rat gilt für Sammlungen, aber die meisten Leute neigen dazu zu missbrauchen arrays anstelle von collections, oder zumindest, dass ist meine Beobachtung.Dem letzten Ton führt zum Einsatz von Generika in Sammlungen. Wenn Sie Ihren container (und indirekt die version der EJB-Spezifikation) ermöglicht die Verwendung generified Schnittstellen für die Methoden, dann verwenden Sie für die zusätzliche Sicherheit geben. Nach allem, um Ihre Kunden zu Prozess
List<DomainObject>
ist eine bessere design-Entscheidung über die Vermietung der client-Prozess eineList
oder eineList<Object>
. Ich möchte betonen, auf den Aspekt des container-Unterstützung wieder einmal, wie EJB 2.x-Schnittstellen unterstützen keine generics (das ist meine Beobachtung), während die EJB-3.x unterstützt generics (aber container können Würgen beim deployment oder Laufzeit) und würde verlangen, dass Ihre lokalen und remote-interfaces programmiert werden, die in einer bestimmten Weise; zum Beispiel WebLogic 10.3.x erfordert die Angabe des Generika in einer super Schnittstelle, die erweitert wird, wie ein local/remote-interface.Erste, es ist nicht ein Problem nur mit EJB. Dies gilt für alle Methoden-Definitionen.
In der Tat, das gleiche wird auch gesagt, dass die definition der Parameter und Variablen:
Je breiter die definition, die gemacht wird, die mehr Freiheit in der Zeit der Umsetzung. Sagen, dass ich definieren:
Lassen Sie uns sagen, dass ich finde, dass ich jemand anderes-Bibliothek Methode zu tun, aber es gibt einen Vector statt ArrayList. Nun, ich werde den Bruch mit code aufruft, um meine Methode oder ich werde kopieren Sie die Daten aus einem Vector in eine ArrayList. Wenn ich definiert hatte den Rückgabetyp als Liste konnte ich wieder jede Instanz.
Warum nicht Sammlung in diesem Fall? Denn List ist eine Spezialisierung der Sammlung, die ist bestellt. Wenn ich will zurück, meine Ergebnisse bestellt, dann werde ich verwenden Liste. Wenn Sie nicht bestellt, dann Sammlung passt besser.