2012-06-13 31 views
5

Tôi mới sử dụng java và khi tôi xem xét mã của nhiều ví dụ trên mạng, tôi thấy mọi người khai báo biến số ArrayList chỉ đơn giản là List trong hầu hết các trường hợp.Tại sao gán một ArrayList mới vào một biến List?

List<String> myList = new ArrayList<String>(); 

Tôi không hiểu nếu có một số lợi thế cụ thể khi thực hiện việc này. Tại sao nó không thể là một số ArrayList, như vậy:

ArrayList<String> myList = new ArrayList<String>(); 
+2

Bạn cần thay đổi ngôn ngữ của mình: Điều này không liên quan đến việc truyền ít nhất. Không nơi nào bạn thấy một diễn viên, '(Danh sách)' đang được sử dụng. –

+1

Tôi nghĩ rằng nó được đề cập: http://stackoverflow.com/questions/4062982/list-versus-arraylist, http://stackoverflow.com/questions/9852831/why-use-list-list-new-arraylist-instead- danh sách array-list-new-array, http://stackoverflow.com/questions/147468/why-should-the-interface-for-a-java-class-be-prefered :-) –

Trả lời

9

Nó được gọi là programming to an interface. Nó cho phép bạn thay thế ArrayList cho một LinkedList nếu một nơi nào đó xuống dòng bạn quyết định rằng LinkedList sẽ phù hợp hơn.

+3

Mặc dù, câu đầu tiên OK, ... _It cho phép bạn thay thế ArrayList đó cho một LinkedList nếu ở đâu đó bên dưới dòng bạn quyết định rằng một LinkedList sẽ thích hợp hơn._ không phát ra âm thanh ngay –

+1

@OpDeCirkel Có gì sai với nó? Đó là một trong những ưu điểm của lập trình cho một giao diện. – Jeffrey

3

Bởi vì nếu bạn quyết định thay đổi nó sau này nó dễ dàng hơn:

List<String> myList = new ArrayList<String>(); 
List<String> myList = new LinkedList<String>(); 

Đó là quan trọng hơn trong chữ ký phương pháp, khi thay đổi những gì bạn quay trở lại có thể buộc tất cả mọi người sử dụng chức năng của bạn để thay đổi mã của họ.

2

Đây không phải là diễn viên mà bạn đang sử dụng giao diện làm loại được khai báo của biến. Lý do để làm điều này là bạn có thể chuyển đổi cài đặt danh sách nào bạn đang sử dụng. Nếu người dùng của danh sách chỉ phụ thuộc vào giao diện Danh sách, họ sẽ không bị ảnh hưởng nếu bạn sử dụng một loại danh sách khác, chẳng hạn như LinkedList.

+0

Tôi đoán, thay vì nói _interface là type_ đã khai báo, bạn muốn nói _interface là kiểu khai báo của biến_. –

+0

được chỉnh sửa để làm rõ –

1

Java được nhập mạnh theo ngôn ngữ hướng đối tượng. .... Hãy xem qua một ví dụ: Giả sử bạn đang viết hàm sắp xếp sort(ArrayList<> list). Nếu hàm được khai báo theo cách đó, java sẽ không cho phép bạn sắp xếp bất kỳ thứ gì khác với hàm đó hơn ArrayList. Cách tiếp cận tốt hơn sẽ là xác định trừu tượng (như trong câu hỏi của bạn là) List. Trong trừu tượng đó, bạn khai báo các phương thức. rằng tất cả các triển khai phải triển khai-xác định (nghĩa là ArrayList). Bây giờ chức năng sort của bạn có thể được khai báo là sort(List<> list) và bạn có thể sắp xếp với bất kỳ thứ gì thực hiện List (và tuân theo hợp đồng của các phương pháp List).
Bằng cách này, bạn có thể sử dụng lại mã mà bạn đã viết cho tất cả các triển khai miễn là chúng tuân theo hợp đồng trừu tượng. Trong Java, bạn đạt được điều này bằng cách sử dụng giao diện làm trừu tượng và các lớp làm triển khai. Có những ưu điểm khác nữa, nhưng bạn đã đọc một số cuốn sách về lập trình hướng đối tượng nếu bạn muốn hiểu chúng tốt hơn.

1

Danh sách là một giao diện để nó có thể lưu trữ tất cả các lớp mở rộng từ giao diện danh sách.Nếu bạn sử dụng sau statment thì sau một số bước lập trình, bạn cũng có thể lưu trữ các đối tượng khác (mở rộng từ danh sách).

List<String> myList = new ArrayList<String>(); 
... 
myList =new LinkedList<String>(); 

Ưu điểm chính là bảo trì mã. Ví dụ: nếu ai đó đến và muốn sử dụng LinkedList thay vì ArrayList, bạn chỉ cần thay đổi một dòng thay vì hàng nghìn mã trong toàn bộ mã. Nó làm cho mã của bạn linh hoạt hơn một chút.

Toàn bộ khái niệm về đa hình trong java dựa trên khả năng của java để sử dụng tham chiếu lớp giao diện/cơ sở để tham chiếu đến các đối tượng lớp con.

Ngoài ra, lập trình cho giao diện thay vì triển khai thực tế luôn được xem là phương pháp hay nhất. Điều này sẽ cho phép các nhà phát triển để thay thế một thực hiện với khác/thực hiện tốt hơn một cách dễ dàng khi cần thiết.

0

1) List là một giao diện, lớp thực hiện là ArrayList
2) giao diện List kéo dài Collection.

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