Tại sao người ta sẽ khai báo một phương thức giao diện Java là trừu tượng?


143

Tôi đã sử dụng tính năng tái cấu trúc "giao diện kéo" của Eclipse ngày hôm nay để tạo ra một giao diện dựa trên một lớp hiện có. Hộp thoại được cung cấp để tạo tất cả các phương thức mới của giao diện mới dưới dạng phương thức "trừu tượng".

Điều gì sẽ là lợi ích của điều đó?

Tôi nghĩ rằng việc bạn được phép khai báo các phương thức giao diện là trừu tượng là một tính năng không cần thiết và vô hại của ngôn ngữ không được khuyến khích đặc biệt.

Tại sao Eclipse lại hỗ trợ một kiểu như vậy hoặc tại sao một người nào đó tự nguyện chọn làm như vậy?

Làm rõ: Tôi không hỏi tại sao các phương thức giao diện là trừu tượng, đó là điều hiển nhiên. Tôi đang hỏi tại sao một người rõ ràng sẽ chọn đánh dấu chúng là trừu tượng vì nếu chúng ở trong một giao diện thì dù sao chúng cũng trừu tượng.

Câu trả lời:


146

Theo Đặc tả ngôn ngữ Java , abstracttừ khóa cho các giao diện đã lỗi thời và không còn được sử dụng. (Mục 9.1.1.1)

Điều đó nói rằng, với xu hướng tương thích ngược của Java, tôi thực sự nghi ngờ nó sẽ tạo ra sự khác biệt cho dù abstracttừ khóa có mặt hay không.


1
Đó là sự hiểu biết của tôi (mặc dù tôi không quen thuộc với phần JLS cụ thể). Tôi đang tự hỏi tại sao Eclipse sẽ cung cấp cho tôi tùy chọn tạo một dấu hiệu khó hiểu ...
Uri

Có tôi Ai đó ở đâu đó phải quyết định đó là một "tính năng" mong muốn và đưa nó vào. Bạn biết đấy, một trong những loại nguồn mở
tồi tệ đó

18
Mặc dù đây là câu trả lời được xếp hạng cao nhất, nhưng nó đề cập đến phần sai của Thông số kỹ thuật; 9.1.1.1 là mô tả abstracttừ khóa trên chính khai báo giao diện, không phải trên các thành viên của nó. Câu trả lời của @ dưới đây là chính xác và cũng chứa các nguồn liên kết hợp lệ.
Ếch xù lông

39

"Lợi ích của việc đó" (thêm phần tóm tắt về khai báo phương thức giao diện) trong nhật thực sẽ là một vấn đề tương thích cũ với trình biên dịch nhật thực jdt trong jdk1.3

Kể từ 1.4, các thư viện jdk không còn chứa các phương thức trừu tượng mặc định (trên các lớp trừu tượng triển khai giao diện).
Điều này đang đánh lừa chẩn đoán trình biên dịch Eclipse 1.3 vì việc triển khai của chúng dựa vào sự tồn tại của chúng.
Lưu ý rằng Javac 1.3 sẽ từ chối hoàn toàn để thực hiện đối với các thư viện 1.4 (sử dụng tùy chọn -boot classpath).

Do trình biên dịch Eclipse có khả năng ở mức tuân thủ 1,4 (xem Workbench>Preferences>Java>Compiler>JDK Compliance) hoặc sử dụng ít nhất 1,3 thư viện lớp nếu sử dụng chế độ tuân thủ 1.3, nên không có sự hiện diện của "trừu tượng" trong hầu hết các dự án nhật thực hiện tại.


3
Tìm tốt Vì vậy, chức năng của nó là giải quyết vấn đề không còn tồn tại trong trình biên dịch Eclipse.
jdmichal

1
@jdmichal: chính xác, và đó cũng là một câu trả lời chính xác hơn cho câu hỏi của Uri.
VonC

39

Từ Java SE 7 JLS (Đặc tả ngôn ngữ Java): "Được phép, nhưng không được khuyến khích là vấn đề về kiểu dáng, để chỉ định một cách thừa thãi công khai và / hoặc công cụ sửa đổi trừu tượng cho một phương thức được khai báo trong giao diện."

Đối với Java SE 5.0 : "Để tương thích với các phiên bản cũ hơn của nền tảng Java, điều đó được cho phép nhưng không được khuyến khích, như một vấn đề về kiểu dáng, chỉ định một cách dự phòng bộ sửa đổi trừu tượng cho các phương thức được khai báo trong các giao diện."


9

Theo các phương thức JLS trong các giao diện theo mặc định là trừu tượng, do đó từ khóa là không cần thiết. Biết điều này, tôi sẽ không bao giờ sử dụng nó để "tránh sự lộn xộn hiện tại".


Đây phải là câu trả lời đúng. Đây là một liên kết được cập nhật - xem phần "ghi chú"
mork

JLS không nói từ khóa đã lỗi thời đối với các phương thức trong giao diện. Nó nói "Nó được cho phép, nhưng không được khuyến khích như là một vấn đề về phong cách, để chỉ định một cách thừa thãi công cụ sửa đổi công khai và / hoặc trừu tượng cho một phương thức được khai báo trong một giao diện." JLS # 9.4 .
Hầu tước Lorne

@EJP Tôi không nói rằng JLS tuyên bố từ khóa sẽ lỗi thời, đây là ý kiến ​​cá nhân của tôi;) BTW họ lưu ý từ khóa này là "dư thừa" không hoàn toàn giống như lỗi thời, vì điều này tất nhiên là bạn đúng . Bây giờ tôi biết tôi sẽ chỉnh sửa câu trả lời để làm rõ điều này.
Daniel Hiller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.