2015-05-02 24 views
5

Java 8 giới thiệu các phương thức mặc định và tĩnh trên các giao diện. Vì vậy, bây giờ bạn có thể có triển khai cụ thể trong giao diện của bạn cho dù sử dụng phương pháp mặc định hoặc tĩnh.Lý do thêm các phương thức mặc định và tĩnh trong các giao diện

Lý do Java yêu cầu thêm hai loại phương pháp mới này là "đảm bảo tính tương thích nhị phân với mã được viết cho các phiên bản cũ hơn của các giao diện đó".

Câu hỏi của tôi:

  • Tại sao để bóp méo khái niệm ban đầu giao diện mà giả sử là hoàn toàn trừu tượng để hỗ trợ các vấn đề kiến ​​trúc hiện hành?
  • Sự khác nhau giữa việc sử dụng lớp trừu tượng và phiên bản giao diện mới khác với khả năng của lớp để mở rộng nhiều giao diện là gì?
+2

Bản sao có thể có của http://stackoverflow.com/questions/22591499/what-are-the-differences-between-abstract-classes-and-interfaces-in-java-8 – Vulcan

+0

@Vulcan câu hỏi của tôi là nhắm mục tiêu sử dụng của bản cập nhật java 8 chứ không phải sự khác biệt giữa giao diện trừu tượng và giao diện –

Trả lời

7

Lý do java tuyên bố thêm 2 loại phương pháp mới này là "đảm bảo tính tương thích nhị phân với mã được viết cho phiên bản cũ hơn của các giao diện đó".

Điều này chỉ áp dụng cho phương pháp mặc định (không phải phương pháp tĩnh) và bỏ qua một số ngữ cảnh. Từ Goetz, State of the Lambda:

Mục đích của các phương pháp mặc định ... là cho phép các giao diện được phát triển theo cách tương thích sau khi xuất bản lần đầu.

Mục tiêu chính là cho phép phát triển giao diện , tức là bổ sung các phương pháp mới. Nếu một phương thức mới được thêm vào một giao diện, các lớp hiện có thực hiện giao diện sẽ thiếu một triển khai thực hiện, điều này sẽ không tương thích. Để tương thích, việc triển khai phải đến từ đâu đó, vì vậy nó được cung cấp theo các phương thức mặc định.

Tại sao làm sai lệch khái niệm ban đầu của giao diện giả sử hoàn toàn trừu tượng để hỗ trợ các vấn đề kiến ​​trúc hiện có?

Mục đích chính của giao diện Java là specify a contract mà bất kỳ lớp nào có thể triển khai mà không phải thay đổi vị trí của nó trong phân cấp lớp. Đúng là, trước Java 8, giao diện hoàn toàn trừu tượng.Tuy nhiên, đây không phải là thuộc tính thiết yếu của giao diện. Ngay cả khi các phương thức mặc định được đưa vào, một giao diện tại trái tim của nó vẫn chỉ định một hợp đồng khi lớp thực hiện. Lớp thực thi có thể ghi đè lên các phương thức mặc định, vì vậy lớp đó vẫn còn trong việc kiểm soát hoàn toàn việc thực hiện nó. (Lưu ý cũng default methods cannot be final đó.)

sự khác biệt giữa việc sử dụng một lớp trừu tượng và phiên bản mới của giao diện khác hơn so với khả năng của một lớp học để mở rộng nhiều giao diện là gì?

Khả năng của lớp để mở rộng nhiều giao diện có liên quan chặt chẽ với sự khác biệt giữa giao diện và lớp trừu tượng, cụ thể là giao diện không thể chứa trạng thái. Đây là khó khăn chính khi cho phép đa thừa kế: nếu một siêu lớp xuất hiện nhiều lần trong tổ tiên của một lớp, trạng thái của siêu lớp đó chỉ xuất hiện một lần hay nhiều lần? Một khác biệt khác là các lớp trừu tượng có thể định nghĩa các phương thức và các trường được chia sẻ với các lớp con, nhưng không phải với người gọi, bằng cách sử dụng các mức truy cập được bảo vệ và gói riêng. Giao diện chỉ có thể có các phương thức công khai.

(Trong Java 9, hỗ trợ cho các phương pháp tư nhân đã được thêm vào. Điều này rất hữu ích cho việc chia sẻ thực hiện những phương pháp mặc định hoặc tĩnh của một giao diện.)

Cuối cùng, phương pháp tĩnh trong giao diện không ảnh hưởng đến lớp thừa kế, cũng không phải là một phần của hợp đồng giao diện. Họ chỉ đơn thuần là một cách để tổ chức các phương thức tiện ích theo cách thuận tiện hơn. Ví dụ, việc sử dụng phổ biến các phương thức tĩnh trong một giao diện là cho các phương thức nhà máy tĩnh. Nếu các phương thức tĩnh không được cho phép trong các giao diện, các phương thức factory tĩnh sẽ phải được đặt trên một lớp đồng hành. Việc cho phép các phương thức tĩnh trong các giao diện cho phép các phương thức như vậy được nhóm lại với chính giao diện đó, khi làm như vậy là thích hợp.

2

Vấn đề là bạn không bao giờ có thể mở rộng Giao diện bằng phương pháp mới mà không vi phạm tính tương thích. Các lớp hiện tại sẽ không thực hiện phương thức và do đó không chạy với phiên bản mã mới sử dụng phương thức này.

Đây là vấn đề chính đối với Thư viện lớp Java vì nó không thể thêm thường được yêu cầu cho các phương thức trong giao diện cơ bản (như Bộ sưu tập). Đây là trình điều khiển chính để thực hiện các phương thức mặc định cho các giao diện.

Sự khác biệt giữa phương pháp mới này và sử dụng lớp trừu tượng (là một mẫu khá tốt cho vấn đề này trong một số trường hợp) là bạn không thể kế thừa từ nhiều lớp trừu tượng. Nhưng bạn có thể dễ dàng thực hiện nhiều giao diện.

Phương pháp tĩnh trong giao diện ít rõ ràng hơn, tôi nghĩ rằng chúng ở đây để giúp bạn triển khai các phương thức mặc định (nếu hai phương thức mặc định có cùng mã, cả hai đều có thể gọi đến phương thức tĩnh).

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