2012-12-19 11 views
7

Mam sytuację, w której otrzymuję dane z bazy danych, i chcę podnieść ją do ArrayList of objects, a następnie spuścić ją do innej niestandardowej tablicy ArrayList, tj. List<User>, List<Groups> itpKoszt odlewania do ArrayList obiektów, a następnie odlewania do niestandardowej ArrayList

Moje pytanie jest do odlewania do obiektu, a następnie w dół odlewania do ArrayList, jaki będzie koszt, i jest to skuteczne i dobrą praktyką.

EDITED

Zamiast pobierania danych jak List<User>, List<Groups> etc Chcę uzyskać dane jako ArrayList<objetcs> raz, a potem, jak na moje potrzeby, będę przygnębiony dane ArrayList<User>,ArrayList<Groups> później.

+0

pierwszy zobaczyć tutaj:-http: //forum.codecall.net/topic/50451-upcasting-downcasting/#axzz2FVaJIIvA –

Odpowiedz

5

"Rzucanie w dół" nie jest dobrym pomysłem, ponieważ nie powinieneś używać żadnych specyficznych metod ArrayList. Powinieneś być w stanie użyć List dla każdej rzeczy. Jedynymi publicznymi metodami ArrayList, które nie są na liście, są ensureCapacity (co nie jest tak użyteczne, jak to wygląda) i trimToSize, co jest rzadko przydatne.

Pod względem kosztów zależy to od tego, czy prawdopodobnie nie uda się rzucić. Jeśli nie rzucasz wyjątków, typowe sprawdzenie może zająć około 40 nano-sekund. Upgrade powinien być zoptymalizowany przez JIT.

+2

myślę uskok jest no-op, aby rozpocząć z. Jeśli kompilator Java ustali, że określone wyrażenie rzutowania jest upcastem, nie emituje on kodu bajtowego do odlewania. –

+0

co masz na myśli mówiąc "prawdopodobnie nie powiodło się" – Androider

+0

Jeśli wykonasz 'List list = new LinkedList(); ArrayList alist = (ArrayList) list; 'będzie * dużo * wolniej. –

3

Jeśli baza danych nie zwróci wartości ArrayList, rzutowanie nie spowoduje jej konwersji - zamiast tego w czasie wykonywania pojawi się ClassCastException. Zamiast tego należy utworzyć nową kolekcję typu, którego chcesz użyć, i wywołać jej metodę addAll(Collection c) w kolekcji zwróconej z bazy danych.

0

"Koszt" pod względem wydajności wyniesie praktycznie zero (jedynym kosztem jest kontrola czasu pracy na obniżonym poziomie).

Casting nie zmienia listy jako takiej, tylko typ referencji.

W jakiej formie (typ danych) otrzymujesz "dane z bazy danych"? Jeśli spodziewasz się konwersji z np. zestaw wyników JDBC do listy, który nie będzie działał z rzutowaniem - w celu pobrania danych trzeba wykonać iterację w ResultSet.

2

Jeśli zaczniesz z ArrayList<Object>, rzucając to ArrayList jest nie jest uskok: to po prostu rzuca parametryczne typ surowca do jego odpowiednika. Co więcej, odlewanie ArrayList do jest nie jest downcastem, albo: jest to niezaznaczone odlewanie po odlaniu w typ sparametryzowany. Oba są artefakty kompilatora tylko i mają nie runtime odpowiednik.

2

Jeśli jesteś getting/saving różne tabele z database następnie dla każdej table najpierw utworzyć klasy dla każdego table z pełnym odwzorowaniu table. Następnie w funkcjach (Wstawianie, aktualizowanie, usuwanie, wybieranie) przekazywać dane z odpowiednimi obiektami klasy tabeli. i używaj jak jest. W tym celu należy utworzyć inną funkcję, aby uzyskać lub zapisać dane w tabeli. Ale jest to najbardziej efektywny sposób wykonania tego zadania.Aby uzyskać więcej informacji na temat upcasting/rzutowanie w dół zobaczyć link here