2012-12-19 29 views
7

Tôi có một tình huống mà tôi đang nhận dữ liệu từ cơ sở dữ liệu, và tôi muốn upcast nó để ArrayList of objects và sau đó downcast nó khác nhau tùy chỉnh ArrayList tức là List<User>, List<Groups>, v.v.Chi phí của Up-casting để ArrayList của các đối tượng và sau đó xuống đúc để tùy chỉnh ArrayList

Câu hỏi của tôi được dựng lên đối tượng và sau đó truyền xuống ArrayList, chi phí sẽ là gì và thực hành tốt hay hiệu quả.

EDITED

Thay vì nhận được dữ liệu như List<User>, List<Groups> vv Tôi muốn lấy dữ liệu như ArrayList<objetcs> lần và sau đó theo nhu cầu của tôi, tôi sẽ downCast dữ liệu để ArrayList<User>,ArrayList<Groups> sau này.

+0

trước tiên hãy xem: -http: //forum.codecall.net/topic/50451-upcasting-downcasting/#axzz2FVaJIIvA –

Trả lời

5

"Truyền xuống" không phải là một ý tưởng hay vì bạn không cần sử dụng bất kỳ phương pháp cụ thể nào của ArrayList. Bạn có thể sử dụng List cho mọi thứ. Các phương thức công khai duy nhất mà ArrayList cung cấp không có trong Danh sách là ensureCapacity (không hữu ích như nó) và trimToSize, điều này hiếm khi hữu ích.

Về chi phí, điều đó tùy thuộc vào việc bạn có khả năng không thực hiện truyền xuống hay không. Nếu bạn không ném ngoại lệ, kiểm tra kiểu điển hình có thể mất ~ 40 nano giây. Upcast nên được tối ưu hóa bởi JIT.

+2

Tôi nghĩ rằng upcast là không có gì để bắt đầu với. Nếu trình biên dịch Java xác định rằng một biểu thức cast cụ thể là một upcast, nó không phát ra bất kỳ bytecode casting nào. –

+0

ý của bạn là gì 'có khả năng không bị bỏ' – Androider

+0

Nếu bạn thực hiện 'Danh sách danh sách = new LinkedList(); Danh sách ArrayList alist = (ArrayList), 'nó sẽ * nhiều * chậm hơn. –

3

Nếu cơ sở dữ liệu không thực sự trả lại ArrayList, việc truyền sẽ không chuyển đổi nó cho bạn - thay vào đó bạn sẽ thấy ClassCastException khi chạy. Thay vào đó, bạn nên tạo một bộ sưu tập kiểu mới mà bạn muốn sử dụng và gọi phương thức addAll(Collection c) của nó trên bộ sưu tập được trả về từ cơ sở dữ liệu.

0

"Chi phí" về hiệu suất sẽ thực tế bằng không (chi phí duy nhất là trong kiểm tra thời gian chạy trên downcast).

Truyền không thay đổi danh sách theo từng loại, chỉ là loại tham chiếu.

Trong biểu mẫu nào (datatype) bạn có nhận được "dữ liệu từ cơ sở dữ liệu" không? Nếu bạn mong muốn có thể chuyển đổi từ ví dụ: một JDBC ResultSet vào một List, nó sẽ không hoạt động với một diễn viên - bạn thực sự cần phải lặp qua ResultSet để lấy dữ liệu.

2

Nếu bạn bắt đầu bằng số ArrayList<Object>, hãy truyền số này đến ArrayListkhông phải là upcast: nó chỉ tạo kiểu tham số cho đối tác thô của nó. Hơn nữa, hãy đúc ArrayList tới ArrayList<String>không phải là một số lùi xuống, hoặc: đó là bỏ chọn một đoạn được chọn thành một loại được tham số hóa. Cả hai chỉ là hiện vật trình biên dịch chỉ và có không có thời gian chạy tương đương.

2

Nếu bạn là getting/saving bảng khác nhau từ database sau đó cho mỗi table đầu tiên tạo ra các lớp học cho mỗi table với bản đồ đầy đủ của table. Sau đó, trong các chức năng của (Chèn, cập nhật, xóa, chọn) truyền dữ liệu với các đối tượng lớp bảng tương ứng. và sử dụng như nó được. Đối với điều này, bạn phải tạo chức năng khác nhau để nhận hoặc lưu dữ liệu vào bảng. Nhưng đó là cách hiệu quả nhất để thực hiện nhiệm vụ này.Để biết thêm thông tin về upcasting/downcasting, hãy xem liên kết here

Các vấn đề liên quan