2011-02-06 40 views
7

LinkedList có các mô tả tương tự cho phương pháp element() và phương pháp getFirst() (kỳ lạ - không phải cùng một từ).Sự khác nhau giữa các phương thức element() và getFirst() trong lớp LinkedList là gì?

Deque nêu rõ rằng hai phương pháp giống nhau về mặt giá trị trả lại và ngoại lệ.

Câu hỏi của tôi là - tại sao có 2 phương pháp giống nhau? Nó có tương thích ngược không? Một phương pháp có hiệu quả hơn phương pháp khác không?

Trả lời

5

element() được thừa hưởng từ Queue nơi nó làm cho tinh thần để có chỉ một phương pháp truy cập từ tất cả các bạn có thể làm trong một hàng đợi là loại bỏ các yếu tố đầu tiên. Tuy nhiên, một deque hỗ trợ điều này từ cả hai kết thúc, đòi hỏi phải có phương pháp rõ ràng để làm như vậy.

Và nó không phải là rất tốt đẹp để thiết kế một API, nơi bạn sẽ truy cập vào các yếu tố đầu tiên với element() và cuối cùng với getLast().

Một điều mà có thể chơi thành này là Deque đã được bổ sung trong 1.6, nơi các bộ phận của phần cổ Framework Java Collections đã lỗi thời bởi công ước mới, chẳng hạn như rõ ràng get~/set~ phương pháp để truy cập tài sản. Trong bối cảnh đó, getFirst()getLast tuân thủ chặt chẽ hơn các quy ước Java hiện tại.

+0

Thực tế quy ước get/set không thực sự mới, nó thực sự cũ hơn khung thu thập (ví dụ so sánh lớp Vector cũ với giao diện Danh sách mới hơn). –

+0

Tôi thành thật nghĩ rằng trong trường hợp đó, phương thức element() cần được loại bỏ. Giả sử điều đó sẽ không được nhiều người đánh giá cao, có thể ít nhất nó không được chấp nhận? Hoặc ít nhất, một số loại hướng dẫn trong Javadocs về phương pháp nào để chọn ra hai phương pháp này. (Tôi khá chắc chắn rằng đây không phải là ví dụ duy nhất của các phương thức trùng lặp trong Java). – user183037

+0

@ Paŭlo: Tôi đoán họ không thực sự quan tâm nữa, đặc biệt là với các bộ sưu tập. Trong khi họ không chấp nhận như 99% của Swing và làm cho nó cồng kềnh hơn, colletions giữ lại các phương pháp như 'size()': | – Joey

0

Trong liên kết được liệt kê, có vẻ như chúng giống nhau. Nhưng trong một Hàng đợi, element() có vẻ là một phương pháp để đạt đỉnh ở phần tử đầu tiên trong hàng đợi, nhưng không loại bỏ nó khỏi hàng đợi.

3

Trong Java 1.6, LinkedList triển khai Deque (Hàng đợi đôi đã kết thúc). Từ Deque.element() javadocs:

lấy, nhưng không loại bỏ, người đứng đầu của hàng đợi đại diện bởi deque này (hay nói cách khác, tử đầu tiên của deque này). Phương pháp này khác với chỉ peek ở chỗ nó ném một ngoại lệ nếu deque này là trống.

Phương pháp này tương đương với getFirst().

Trong Java 1.5, LinkedList có cả hai phương pháp, nhưng getFirst() không được hỗ trợ bởi giao diện. Tôi đoán là trong Java 1.6, họ đã triển khai Deque cố ý bao gồm phương pháp này.

Trong Java 1.4, LinkedList chỉ có getFirst(), nhưng không được hỗ trợ bởi giao diện.

Rõ ràng là tôi muốn nói đây là một vấn đề của việc duy trì khả năng tương thích ngược:

  • LinkedList 1,4 có getFirst() và chỉ giao diện List
  • LinkedList 1.5 dụng cụ Queue và do đó cần hỗ trợ tương đương elements() phương pháp
  • LinkedList 1.6 cụ Deque nhưng vì a) nó có để duy trì tương thích ngược và b) bởi chính sách, tất cả các phương pháp này cần được hỗ trợ bởi giao diện, giao diện Deque cũng bao gồm việc trùng lặp phương pháp
+0

"LinkedList 1.5 thực thi Hàng đợi và do đó cần hỗ trợ các phần tử() tương ứng để lấy phần tử đầu tiên trong một Hàng đợi (đó là phần tử() nào), nó không có ý nghĩa hoàn hảo để chỉ sử dụng getFirst() - cái gì được thành lập từ 1.4? (Tôi chỉ cố gắng làm rõ nó, tôi không cố tranh chấp). – user183037

+0

@ user183037 trong 1.4, LinkedList có 'getFirst()' và Queue có 'element()' nhưng LinkedList chưa thực hiện Queue. Sau đó, khi thực hiện, cả hai phương pháp đều cần thiết cho khả năng tương thích ngược (mặc dù hợp đồng của chúng bằng nhau) –

+0

Tôi lấy lại, tôi vừa nhận ra Hàng đợi chỉ được giới thiệu trong 1.5. Không, tôi bối rối. Tôi đoán họ không muốn tên element() trong giao diện Queue. –

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