2010-03-16 39 views
6

Tôi mới để java, tôi đã thấy trong mã ở nhiều nơi người cao niên của tôi đã khai báo làđa hình cuộc gọi

List myList = new ArrayList(); (option1)

Thay vì

ArrayList myList = new ArrayList(); (option2)

Bạn có thể cho tôi biết tại sao mọi người sử dụng Option1, có lợi thế nào không?

Nếu chúng tôi sử dụng tùy chọn 2, chúng tôi có bỏ lỡ bất kỳ lợi thế hoặc tính năng nào không?

Trả lời

3

Lợi thế của việc sử dụng option1, tức là, List myList = new ArrayList(); là có hành vi đa hình đối với các phương pháp. Say, ví dụ, bạn có thể có một phương pháp mà có các tham số kiểu List,

someMethod(List lst) 
{ 
    lst.doSomething(); 
    //do somethng else..... 
} 

Trong phương pháp này lst có thể loại Linked List, ArrayList hoặc CopyOnWriteArrayList.

+0

@ Zaki, bạn có thể đóng góp cho trang web techincal của tôi không? – gmhk

+0

@harigm, Id thích. – Zaki

+0

techification dot com là trang web, tôi đang làm việc trên trang web, sẽ cập nhật cho bạn – gmhk

10

Tùy chọn 1 được coi là lập trình cho giao diện , trong đó tùy chọn 2 là lập trình để triển khai . Sau này đôi khi cần thiết, nhưng trước đây cung cấp cho bạn khả năng dễ dàng chuyển đổi các triển khai bằng cách đảm bảo rằng bạn không phụ thuộc vào các phương thức được cung cấp bởi một triển khai cụ thể. Ngoài ra, nếu bạn tạo các phương thức chỉ cần chức năng được cung cấp bởi giao diện thì chúng sẽ được khai báo là yêu cầu giao diện để bất kỳ đối tượng nào thực hiện giao diện có thể được truyền cho chúng. Làm như vậy sẽ mở rộng phạm vi để sử dụng lại API. Ví dụ:

// This can be called passing any List 
public int countItems(List lst, Filter flt) { 
    // iterate list, apply filter, and count matching objects 
    } 

// This can called passing only an ArrayList, an unnecessary limitation in this case 
public int countItems(ArrayList lst, Filter flt) { 
    // iterate list, apply filter, and count matching objects 
    } 

Điều đó nói rằng, đối với một số giao diện, có các bẫy phụ thuộc thực hiện ẩn (ít nhất là trong Java). Một ví dụ về điều này trong List.get(int); nếu bạn có số ArrayList thì hiệu quả, nhưng đối với LinkedList thì không. Nếu danh sách là rất lớn sự khác biệt có thể rất lớn, đặc biệt đối với một cấu trúc kém quan niệm như vòng lặp này:

for(int xa=0,len=list.length; xa<len; xa++) { 
    Object obj=list.get(xa); 
    obj.doSomething(); 
    } 

trong đó có hiệu suất khủng khiếp cho các danh sách liên kết lớn kể từ khi danh sách phải được đi qua từ đầu cho mỗi get(xa).

+1

Giải thích là tốt, nhưng tôi không nghĩ nó phù hợp để đề cập đến hiệu quả của khung công tác sưu tập Java tại đây. Việc thực hiện JCF là về thuật toán, trong khi harigm đang nói về Nguyên tắc OO – phunehehe

+1

@Phunehehe: Khi nguyên tắc OO liên quan trực tiếp đến việc cho phép thay thế trong suốt việc triển khai, có vẻ như khá thích hợp để thảo luận về bẫy tiềm năng khi thực hiện điều đó. –

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