2013-08-12 62 views
28

Tôi nhìn vào phương pháp khuyến nông ảo mới trong Java 8 giao diện:Java 8: phương pháp khuyến nông ảo vs lớp trừu tượng

public interface MyInterface { 
    default String myMethod() { 
     return "myImplementation"; 
    } 
} 

tôi nhận được mục đích của họ trong việc cho phép một giao diện để phát triển theo thời gian, và nhiều bit thừa kế, nhưng chúng trông khủng khiếp như một lớp trừu tượng đối với tôi.

Nếu bạn đang thực hiện công việc mới là các lớp trừu tượng được ưu tiên hơn các phương pháp mở rộng để cung cấp triển khai cho một "giao diện" hoặc hai phương pháp tiếp cận khái niệm tương đương?

+8

http://www.lambdafaq.org/do-default-methods-introduce-multiple-inheritance-to-java/ - sự khác biệt giữa kế thừa hành vi so với kế thừa trạng thái là rất quan trọng. – assylias

+0

Và [Phương pháp 'mặc định' là gì?] (Http://www.lambdafaq.org/what-are-default-methods/) có khá nhiều mục đích chính xác. Mục đích chính của họ là để cho phép tương thích ngược với mã biên dịch chống lại Java 7 và sẽ không thực hiện bất kỳ phương thức "chức năng" nào được thêm vào Java 8. – jason

Trả lời

30

Một mục đích chính của các cấu trúc như vậy là để duy trì khả năng tương thích ngược. Việc bổ sung các bao đóng cho ngôn ngữ Java là một thay đổi lớn, và mọi thứ cần được cập nhật để tận dụng triệt để điều này. Ví dụ: Collection trong Java 8 sẽ có các phương thức như forEach() hoạt động cùng với lambdas. Chỉ cần thêm các phương thức như vậy vào giao diện Collection đã tồn tại từ trước sẽ không khả thi, vì nó sẽ phá vỡ khả năng tương thích ngược. Một lớp tôi đã viết trong Java 7 thực hiện Collection sẽ không còn biên dịch vì nó sẽ thiếu các phương thức này. Do đó, các phương pháp này được giới thiệu với triển khai "mặc định". Nếu bạn biết Scala, bạn có thể thấy rằng Java interface s đang trở nên giống Scala trait s.

Đối với giao diện so với lớp trừu tượng, cả hai vẫn là khác nhau trong Java 8; bạn vẫn không thể có một hàm tạo trong một giao diện, ví dụ. Do đó, hai phương pháp tiếp cận không phải là "khái niệm tương đương" mỗi se. Các lớp trừu tượng được cấu trúc nhiều hơn và có thể có một trạng thái kết hợp với chúng, trong khi các giao diện có thể không. Bạn nên sử dụng cái nào có ý nghĩa hơn trong ngữ cảnh của chương trình, giống như bạn làm trong Java 7 và dưới đây.

5
  1. Các lớp trừu tượng không thể lớp gốc của biểu thức lambda, trong khi giao diện với phương pháp khuyến nông ảo có thể được.
  2. Lớp trừu tượng có thể có hàm tạo và biến thành viên, trong khi giao diện không thể. Tôi tin rằng việc thực hiện của một nhà xây dựng có thể, và có thể ném một ngoại lệ được kiểm tra mà ngăn cấm các lớp trừu tượng từ gốc của một biểu thức lambda.

Nếu bạn muốn viết API cho phép người dùng sử dụng biểu thức lambda, bạn nên sử dụng giao diện thay thế.

5

Lớp trừu tượng giữ trạng thái (trường mẫu), để cung cấp một số hành vi (phương pháp) phổ biến.
Bạn không thường (bao giờ?) Thấy một lớp trừu tượng không có trạng thái.

Giao diện chỉ định chức năng. Họ có nghĩa là tuyên bố hành vi như là một hợp đồng, không thực hiện nó.
Do đó, bất kỳ phương pháp nào được chỉ định là một phần của giao diện là các phương thức "trợ giúp" - chúng không ảnh hưởng đến việc triển khai.

+1

'java.util.AbstractCollection'? Nó là bình thường đối với các lớp trừu tượng không có trạng thái. Từ Java SE 8, thực tế là các lớp trừu tượng có thể có trạng thái cá thể và các giao diện với việc triển khai không thể chỉ là một ngôn ngữ kỳ quặc. –

+1

@ TomHawtin-tackline: Nhưng nếu bạn nhìn vào tài liệu cho 'AbstractCollection', nó nói, *" Lớp này cung cấp việc triển khai bộ xương của giao diện 'Bộ sưu tập', để giảm thiểu nỗ lực cần thiết để triển khai giao diện này." * các từ, nó chỉ là một tính năng tiện lợi, nhưng nó không cần phải có ở đó vì bất kỳ lý do thiết kế cụ thể nào. Ngược lại, 'Bộ sưu tập' là * cần thiết * để viết mã chung phù hợp với tất cả các bộ sưu tập. – Mehrdad

+0

Tôi không nghĩ điều đó có liên quan. Đúng là lớp trừu tượng thường không giữ trạng thái. Trong Java SE 8 tôi tin rằng 'Bộ sưu tập' sẽ chứa một số *" thực hiện xương của giao diện 'Bộ sưu tập'" * –

0

Abstract classes điểm trên java-8 giao diện ở các khu vực bên dưới.

  1. Với lớp trừu tượng, bạn có thể khai lĩnh vực có không tĩnh và cuối cùng, và xác định phương pháp bê tông công cộng, bảo vệ, và tin. Với giao diện, mọi lĩnh vực sẽ được tự động công cộng, tĩnh, và cuối cùng, và tất cả các phương pháp mà bạn khai báo hoặc xác định (như các phương pháp mặc định) là công khai

  2. bang Biên Đổi thể được chia sẻ/sửa đổi với các lớp con không giống như giao diện chỉ có các hằng số

  3. Lớp trừu tượng có thể được sử dụng để triển khai Template_method_pattern: Nó xác định khung chương trình của thuật toán trong một thao tác, trì hoãn một số bước cho các lớp con.
  4. Lớp trừu tượng có thể được sử dụng để triển khai Decorator_pattern: Mẫu thiết kế cho phép hành vi được thêm vào một đối tượng riêng lẻ, tĩnh hoặc động, mà không ảnh hưởng đến hành vi của các đối tượng khác từ cùng một lớp.
Các vấn đề liên quan