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)
.
Nguồn
2010-03-16 03:06:11
@ Zaki, bạn có thể đóng góp cho trang web techincal của tôi không? – gmhk
@harigm, Id thích. – Zaki
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