2012-12-19 18 views
7

Ich habe eine Situation, in der ich Daten aus der Datenbank abrufen, und ich möchte es auf ArrayList of objects upcasieren und dann auf verschiedene benutzerdefinierte ArrayList dh List<User>, List<Groups> usw.Kosten von Up-Casting zu ArrayList von Objekten und dann Down-Casting zu benutzerdefinierten ArrayList

Meine Frage ist up-Casting zu Objekt und dann Down-Casting zu ArrayList, was wird die Kosten sein, und ist es effizient oder gute Praxis.

EDITED

Statt sich Daten wie List<User>, List<Groups> usw. Ich möchte Daten als ArrayList<objetcs> einmal bekommen und dann nach meinem Bedürfnis, werde ich Daten zu ArrayList<User>,ArrayList<Groups> später niedergeschlagen.

+0

erste siehe: -http: //forum.codecall.net/topic/50451-upcasting-downcasting/#axzz2FVaJIIvA –

Antwort

5

"Downcasting" ist keine gute Idee, da Sie keine ArrayList-spezifischen Methoden verwenden sollten. Sie sollten List für jede Sache verwenden können. Die einzigen öffentlichen Methoden, die ArrayList bereitstellt und die nicht in List enthalten sind, sind ensureCapacity (was nicht so nützlich ist, wie es aussieht) und trimToSize, was selten nützlich ist.

In Bezug auf die Kosten hängt es davon ab, ob Sie Downcast wahrscheinlich nicht ausführen werden. Wenn Sie keine Ausnahmen auslösen, dauert eine typische Typprüfung ~ 40 Nanosekunden. Upcast sollte vom JIT weg optimiert werden.

+2

Ich denke upcast ist ein No-op zu beginnen mit. Wenn der Java-Compiler feststellt, dass ein bestimmter Cast-Ausdruck ein Upcast ist, gibt er keinen Casting-Bytecode aus. –

+0

was meinst du mit "wahrscheinlich nicht zum downcast" – Androider

+0

Wenn Sie tun List List = new LinkedList(); ArrayList alist = (ArrayList) list; 'wird * viel * langsamer sein. –

3

Wenn die Datenbank keine ArrayList zurückgibt, wird Casting nicht für Sie konvertieren - stattdessen wird zur Laufzeit ein ClassCastException angezeigt. Sie sollten stattdessen eine neue Sammlung des Typs instanziieren, den Sie verwenden möchten, und die Methode addAll(Collection c) für die aus der Datenbank zurückgegebene Sammlung aufrufen.

0

Die "Kosten" in Bezug auf die Leistung wird praktisch Null sein (die einzigen Kosten sind in der Laufzeitprüfung auf der downcast).

Casting ändert nicht die Liste an sich, sondern nur den Typ der Referenz.

In welcher Form (Datentyp) erhalten Sie die "Daten aus der Datenbank"? Wenn Sie erwarten, in der Lage zu sein, von z.B. ein JDBC ResultSet zu einer Liste, die nicht mit einem Cast funktioniert - Sie müssen das ResultSet tatsächlich durchlaufen, um die Daten zu erhalten.

2

Wenn Sie mit einem ArrayList<Object> beginnen, ist dies ArrayList Gießen kein upcast: es wirft nur eine parametrisierte Typ seiner rohen Pendant. Darüber hinaus ist ArrayList zu ArrayList<String> zu keine, ungeprüfte Besetzung in einem parametrisierten Typ. Beide sind Compiler Artefakte nur und haben keine Laufzeitäquivalent.

2

Wenn Sie getting/saving verschiedene Tabellen aus database dann sind für jede table ersten Klassen erstellen für jede table mit voller Abbildung von table. Dann in den Funktionen (Einfügen, Aktualisieren, Löschen, Auswählen) übergeben Daten mit entsprechenden Tabellenklassenobjekte. und verwenden, wie es ist. Dazu müssen Sie verschiedene Funktionen erstellen, um Daten zu erhalten oder zu speichern. Aber es ist der effizienteste Weg, diese Aufgabe zu erledigen.Weitere Informationen über Upcasting/Downcasting den Link here

Verwandte Themen