2013-07-03 20 views
7

tôi tiếp tục đi ngang qua mã nơi người khởi tạo một ArrayList mới và gán nó vào giao diện List, như thế này:Tại sao một số người sử dụng lớp cơ sở Danh sách để tạo một ArrayList mới?

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

lý do đằng sau phương pháp này là gì?

+3

để bạn có thể thay đổi ý định về 'ArrayString' mà không phải viết lại mã. – akappa

+2

Danh sách không phải là một lớp cơ sở, nó là một giao diện. –

+3

Nó không chỉ được sử dụng bởi "* một số người *". Nó là phải. – Lion

Trả lời

3

Lập trình với một giao diện, không phải là một thực hiện

Đó là một design pattern từ Gang of Four (GOF). Tại sao vậy?

Bạn hướng dẫn theo hợp đồng trừu tượng thay vì triển khai cụ thể.

public class MyClass { 

    private List myList ; 

    public setMyList(List list){ 
     myList=list; 
    } 

} 

thay vì thực hiện ArrayList bạn muốn thực hiện LinkedList? theo cách đó, bạn chỉ phải tiêm thuộc tính đó với bộ setter.

Trừu tượng là chìa khóa, bạn không biết gì về việc triển khai chỉ hướng dẫn theo đặc điểm kỹ thuật.

đọc này What does it mean programming to an interface?

16

Để tách mã của bạn từ một thực hiện cụ thể của giao diện.

Điều này cũng giúp bạn chuyển sang triển khai khác của giao diện List trong tương lai.

Ví dụ -

Bạn có List<String> names = new ArrayList<String>(); sau này bạn quyết định rằng bạn nên sử dụng một số thực hiện khác của giao diện List, nói LinkedList do đó bạn sẽ chỉ cần thay đổi nó để List<String> names = new LinkedList<String>(); và không có gì phá vỡ.

+0

Vì vậy, ArrayList có thể được đưa vào một triển khai Danh sách nếu cần sau này? –

+1

Nó có thể được * thay thế * với thực hiện khác của Danh sách. – user2357112

+6

'Vector' là một lớp thừa kế, lỗi thời, xấu xí, hận thù mà người ta không nên sử dụng nữa. – Lion

3
List<String> names = new ArrayList<String>(); 

Với mà bạn viết mã so với giao diện List, mà làm cho nó dễ dàng để chuyển đổi thực hiện trong tương lai nếu bạn phải.

Trong trường hợp đó những điều sau đây sẽ đủ -

List<String> names = new //some other implementation of List 

Bây giờ nếu bạn làm điều gì đó như sau -

ArrayList<String> names = new ArrayList<String>(); 

Bạn sẽ mã hóa chống lại việc thực hiện ArrayList riêng của mình. Và mã của bạn được gắn với triển khai cụ thể đó. Trong trường hợp nếu bạn phải chuyển đổi việc thực hiện thì nó sẽ đòi hỏi rất nhiều thay đổi mã.

Kiểm tra docs để khám phá một số các implemenation tiêu chuẩn được cung cấp bởi Java 6.

4

đang như vậy không sử dụng lớp List, nó tuyên bố biến như là kiểu List.Điều này được gọi abstraction

List là một giao diện , trong đó xác định những gì các phương pháp lớp thực tế có, mà không chỉ định lớp học thực tế được sử dụng.

Mặc dù không phải là một vấn đề lớn ở đây, thực tiễn này có thể rất quan trọng, thậm chí cần thiết trong các tình huống phức tạp hơn. Đó là thực hành tốt để luôn luôn làm theo mô hình này.

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