Bây giờ, không phải tất cả các khai báo phương thức trong Giao diện Java là trừu tượng công khai, các phương thức có nên được khai báo với các sửa đổi này không?


14

Bắt đầu với Java 8, defaultcác phương thức đã được đưa vào các giao diện. Một cách hiệu quả, phương tiện này mà không phải tất cả các phương pháp trong một interfaceabstract .

Bắt đầu với Java 9 (có thể), privatecác phương thức sẽ được cho phép. Điều này có nghĩa rằng không phải tất cả các phương pháp trong một interfacepublic abstract .

Câu hỏi "Các phương thức trong giao diện Java có nên được khai báo có hoặc không có công cụ publicsửa đổi truy cập không?" đã được hỏi tại Stack Overflow tại /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m

Ở đó, hầu hết các câu trả lời cho rằng public abstractkhông nên sử dụng vì không có phương pháp nào trong một interfacecó thể là bất cứ điều gì khác ngoàipublic abstract . Điều này không còn là trường hợp nữa.

Vì vậy, trong các tính năng mới của các giao diện, nên public abstract từ khóa có nên được sử dụng trong khai báo phương thức giao diện Java không?

Trong môi trường cụ thể của tôi, chúng tôi sẽ có những người là kỹ sư phần mềm có kinh nghiệm, nhưng không có kinh nghiệm về Java, thỉnh thoảng đọc mã Java. Tôi cảm thấy rằng việc bỏ đi các public abstracttừ khóa bây giờ sẽ tạo thêm một điểm nhầm lẫn cho những người không quen thuộc với lịch sử về cách các giao diện xuất hiện để có các quy tắc khác nhau để sử dụng các từ khóa này.


5
bạn đã kiểm tra Java 8 JLS chưa? Phần giống như trong câu trả lời cũ được chấp nhận tại SO cho thấy rằng việc giới thiệu các phương thức mặc định đã không thay đổi khuyến nghị trước đó dựa trên cùng các cân nhắc dự phòng: "Phương thức giao diện thiếu công cụ defaultsửa đổi hoặc công cụ staticsửa đổi là hoàn toàn abstract... không khuyến khích như một vấn đề về phong cách, để chỉ định một cách thừa thãi công cụ abstractsửa đổi cho một tuyên bố phương thức như vậy. " Tại sao bạn mong đợi rằng mọi thứ sẽ thay đổi?
gnat

3
Tôi nghĩ mọi thứ có thể thay đổi bởi vì điều kiện để một phương thức được ngầm hiểu abstractđang ngày càng trở nên hỗn độn. Trong Java 9, cùng một câu có thể là "Phương thức giao diện thiếu công cụ defaultsửa đổi hoặc công cụ staticsửa đổi hoặc công cụ privatesửa đổi hoàn toàn trừu tượng ..." Ngoài ra, các đối số phụ trợ không sử dụng từ khóa một cách rõ ràng, cụ thể là tất cả các phương thức giao diện là public abstract, bây giờ đang tranh luận
David Campbell

TBH Tôi không hiểu lý do đằng sau các phương thức "mặc định" và thậm chí các phương thức tĩnh cũng nằm ngoài phạm vi của các giao diện thường được dự định làm. Các giao diện không được coi là yên tâm. Đó là lý do tại sao chúng là loại hữu ích để tham khảo.
Trixie Wolf

1
Các phương thức mặc định @TrixieWolf cho phép các giao diện phát triển. Trước đây và không giống như các lớp, việc thêm một phương thức sẽ phá vỡ mọi triển khai; bây giờ, bạn có thể phát triển một giao diện miễn là bạn có một ứng cử viên mặc định tốt. Xem xét việc thêm streamvào java.util.Collection, hoặc Map.getOrDefault(). Thay thế là tạo giao diện phụ mới và khiến mọi người thất vọng, như Graphics2D, và không ai thích điều đó!
SusanW

Câu trả lời:


2

Để mở rộng câu trả lời StackOverflow:

  1. Công cụ publicsửa đổi truy cập là không cần thiết bởi vì

    Mọi khai báo phương thức trong phần thân của một giao diện đều được công khai hoàn toàn (§.6.6). 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 cho một khai báo phương thức trong một giao diện. ( Mục 9,4 )

  2. Công cụ abstractsửa đổi truy cập là không cần thiết bởi vì

    Phương thức mặc định là phương thức được khai báo trong giao diện với công cụ sửa đổi mặc định; cơ thể của nó luôn luôn được đại diện bởi một khối .

    Và ...

    Một phương thức giao diện thiếu một công cụ sửa đổi mặc định hoặc công cụ sửa đổi tĩnh hoàn toàn trừu tượng , do đó phần thân của nó được biểu thị bằng dấu chấm phẩy chứ không phải khối.

Do các phương thức mặc định phần thân và các phương thức vốn không trừu tượng và mọi khai báo phương thức trên giao diện vốn là công khai, bạn không cần chỉ định một từ khóa.


Một trong những ý kiến ​​về một câu trả lời cho biết:

Đừng làm họ suy nghĩ! Tôi luôn thêm trừu tượng công khai trước đây, bất chấp cảnh sát phong cách, vì nó làm cho mọi thứ rõ ràng và nhắc nhở người đọc. Bây giờ tôi được minh oan vì Java 8 và 9 làm phức tạp mọi thứ (user949300)

Một nhận xét về câu hỏi StackOverflow (được bình chọn lên tới 18 lần) bác bỏ điều này:

Thật tệ vì viết nó dưới dạng công khai ngụ ý rằng nó có thể không công khai (Pacerier)

Ý nghĩa của mã, đặc biệt là các giao diện, rất quan trọng.


Nhận xét bạn trích dẫn từ StackOverflow hiện đã lỗi thời. Nói rằng thêm công cụ sửa đổi công khai là văn bản xấu vì nó ngụ ý nó có thể không công khai là mâu thuẫn. Phương pháp có thể không công khai.
David Campbell

@DavidCampbell: Chà, tôi nghĩ câu hỏi này có thể được hỏi tốt hơn sau khi Java 9 xuất hiện. :) Thông số kỹ thuật Java chưa được hoàn thiện có thể trả lời câu hỏi này.
Greg Burghardt

1

Không phải là thiếu một hàm ý tuyên bố khối là đủ? Bạn có thể tuyên bốextends Object mặc dù nó ngụ ý?

Nếu nhà phát triển không hiểu sự dư thừa, rất có thể họ có thể không hiểu đầy đủ khái niệm đằng sau tính năng ngôn ngữ , đây là một vấn đề thậm chí còn lớn hơn so với việc nhầm lẫn về sửa đổi.

Nhà phát triển phải hiểu rằng mục đích của giao diện là tạo ra một hợp đồng xác định cách khách hàng có thể tương tác với một đối tượng. Điều này cho thấy bất kỳ phương thức nào trong một giao diện được sử dụng cho tương tác đối tượng nên được hiển thị cho khách hàng.

Nếu bạn khai báo một phương thức riêng tư, bạn rõ ràng nói rằng phương thức đó không có nghĩa là được gọi bởi các máy khách, trong trường hợp các giao diện là thứ không thể dễ dàng được suy ra.


2
Đừng làm họ suy nghĩ! Tôi luôn luôn thêm public abstracttrước đó, mặc dù cảnh sát phong cách, vì nó làm cho mọi thứ rõ ràng và nhắc nhở người đọc. Bây giờ tôi được minh oan vì Java 8 và 9 làm phức tạp mọi thứ :-). Java đã dư thừa rất nhiều rồi.
dùng949300

1
@ user949300 Bạn cũng có thể thêm extends Objectvào mỗi lớp xuất phát trực tiếp Objectkhông? Đó là thông tin mà một nhà phát triển nên biết, đó là lý do tại sao nó được suy luận. Càng ít thông tin vô dụng trên màn hình, càng dễ xử lý thông tin quan trọng. Hy vọng rằng tôi đã thuyết phục bạn đến với mặt tối (Hiểu không? Vì những thứ ngầm không thể nhìn thấy). Nếu không, nó đáng để bắn haha. Cuối cùng, nó thuộc về những gì làm cho mã dễ quản lý hơn cho nhà phát triển
Vince Emigh

@ user949300 Bằng cách này, bạn có nhiều khả năng tạo ra sự nhầm lẫn về ý nghĩa của nó khi các phương thức giao diện không chứa các khai báo này. tức là nếu có bất kỳ nhà phát triển nào học java bằng cách xem mã của bạn, bạn có khả năng hiểu được cú pháp khai báo giao diện.
JimmyJames

Vince, không, tôi sẽ không mở rộng Object, mặc dù tôi không phù hợp khi tôi thấy mã làm như vậy. @JimmyJames, nếu một người nhất quán thêm trừu tượng công khai vào các mục là như vậy, tôi không thấy bất kỳ sự nhầm lẫn nào. Tui bỏ lỡ điều gì vậy? OTOH, tôi thấy quan điểm của bạn về sự lộn xộn. Ví dụ: tôi không thêm finaltrước các đối số phương thức trừ khi có thứ gì đó buồn cười yêu cầu nó (như lớp bên trong ẩn danh, v.v ...)
user949300

@ user949300 Anh ta có nghĩa là nếu một người dùng đã tiếp xúc với việc thiếu các công cụ sửa đổi và lý do đằng sau nó, họ có thể đặt câu hỏi tại sao những người sửa đổi ở đó khi họ nhìn thấy họ, khiến họ cho rằng có thể có một lý do thực sự đằng sau nó chứ không phải là rõ ràng . Tôi sẽ không ném vừa nếu tôi thấy extends Object, nhưng nó chắc chắn sẽ giương cờ và khiến tôi đặt câu hỏi tại sao. Như tôi đã đề cập trong bài đăng, làm những việc như vậy có thể ám chỉ rằng nhà phát triển có thể hiểu sai về cách thức hoạt động của một cái gì đó (có thể không biết rằng tất cả các đối tượng đã mở rộng Object, do đó phần mở rộng rõ ràng)
Vince Emigh
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.