Một trong những tính năng hữu ích nhất của Java 8 là các default
phương thức mới trên các giao diện. Về cơ bản có hai lý do (có thể có những lý do khác) tại sao chúng được giới thiệu:
- Cung cấp thực hiện mặc định thực tế. Thí dụ:
Iterator.remove()
- Cho phép tiến hóa API JDK. Thí dụ:
Iterable.forEach()
Từ quan điểm của người thiết kế API, tôi muốn có thể sử dụng các công cụ sửa đổi khác trên các phương thức giao diện, vd final
. Điều này sẽ hữu ích khi thêm các phương thức tiện lợi, ngăn chặn ghi đè "tình cờ" trong việc thực hiện các lớp:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Trên đây là thực tế phổ biến nếu Sender
là một lớp:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Bây giờ, default
và final
rõ ràng là mâu thuẫn với các từ khóa, nhưng bản thân từ khóa mặc định sẽ không được yêu cầu nghiêm ngặt , vì vậy tôi cho rằng mâu thuẫn này là có chủ ý, để phản ánh sự khác biệt tinh tế giữa "phương thức lớp với cơ thể" (chỉ phương thức) và "giao diện" phương thức với cơ thể " (phương thức mặc định), nghĩa là sự khác biệt mà tôi chưa hiểu.
Tại một số thời điểm, hỗ trợ cho các sửa đổi như static
và final
trên các phương thức giao diện chưa được khám phá đầy đủ, trích dẫn Brian Goetz :
Phần khác là chúng ta sẽ đi bao xa để hỗ trợ các công cụ xây dựng lớp trong các giao diện, chẳng hạn như phương thức cuối cùng, phương thức riêng tư, phương thức được bảo vệ, phương thức tĩnh, v.v. Câu trả lời là: chúng ta chưa biết
Kể từ thời điểm đó vào cuối năm 2011, rõ ràng, hỗ trợ cho static
các phương thức trong giao diện đã được thêm vào. Rõ ràng, điều này đã thêm rất nhiều giá trị cho chính các thư viện JDK, chẳng hạn như với Comparator.comparing()
.
Câu hỏi:
Lý do final
(và cũng static final
) không bao giờ được đưa vào giao diện Java 8 là gì?
final
ngăn không cho một phương thức bị ghi đè và xem cách bạn PHẢI ghi đè các phương thức được kế thừa từ các giao diện, tôi không hiểu tại sao nó lại có ý nghĩa để làm cho nó cuối cùng. Trừ khi nó là để biểu thị rằng phương thức này là SAU cuối cùng ghi đè lên nó một lần .. Trong trường hợp đó, có thể có khó khăn không? Nếu tôi không hiểu điều này đúng, xin vui lòng cho tôi kmow. Có vẻ thú vị
final
sẽ có một cách sử dụng trong việc ngăn chặn các lớp thực hiện ghi đè lên việc thực hiện mặc định của một phương thức giao diện.