Trong Java 8, các giao diện có thể chứa các phương thức được triển khai, các phương thức tĩnh và các phương thức được gọi là "mặc định" (mà các lớp triển khai không cần ghi đè).
Theo quan điểm của tôi (có lẽ là ngây thơ), không cần phải vi phạm các giao diện như thế này. Giao diện luôn là một hợp đồng bạn phải thực hiện, và đây là một khái niệm rất đơn giản và thuần túy. Bây giờ nó là một kết hợp của một số điều. Theo ý kiến của tôi:
- phương thức tĩnh không thuộc về giao diện. Chúng thuộc về các lớp tiện ích.
- Các phương thức "mặc định" không nên được cho phép trong các giao diện. Bạn luôn có thể sử dụng một lớp trừu tượng cho mục đích này.
Nói ngắn gọn:
Trước Java 8:
- Bạn có thể sử dụng các lớp trừu tượng và thông thường để cung cấp các phương thức tĩnh và mặc định. Vai trò của giao diện rất rõ ràng.
- Tất cả các phương thức trong một giao diện nên được ghi đè bằng cách thực hiện các lớp.
- Bạn không thể thêm một phương thức mới trong một giao diện mà không sửa đổi tất cả các cài đặt, nhưng đây thực sự là một điều tốt.
Sau Java 8:
- Hầu như không có sự khác biệt giữa một giao diện và một lớp trừu tượng (ngoài nhiều kế thừa). Trong thực tế, bạn có thể mô phỏng một lớp học thông thường với một giao diện.
- Khi lập trình các triển khai, lập trình viên có thể quên ghi đè các phương thức mặc định.
- Có lỗi biên dịch nếu một lớp cố gắng thực hiện hai hoặc nhiều giao diện có một phương thức mặc định có cùng chữ ký.
- Bằng cách thêm một phương thức mặc định vào một giao diện, mọi lớp thực hiện sẽ tự động kế thừa hành vi này. Một số trong các lớp này có thể chưa được thiết kế với chức năng mới đó và điều này có thể gây ra vấn đề. Chẳng hạn, nếu ai đó thêm một phương thức mặc định mới
default void foo()
vào một giao diệnIx
, thì lớpCx
triển khaiIx
và có mộtfoo
phương thức riêng có cùng chữ ký sẽ không biên dịch.
Các lý do chính cho những thay đổi lớn như vậy, và những lợi ích mới (nếu có) mà họ thêm vào là gì?
@Deprecated
thể loại! các phương thức tĩnh là một trong những cấu trúc bị lạm dụng nhất trong Java, vì sự thiếu hiểu biết và lười biếng. Rất nhiều phương pháp tĩnh thường có nghĩa là lập trình viên không đủ năng lực, tăng khả năng ghép nối theo một số bậc độ lớn và là cơn ác mộng đối với bài kiểm tra đơn vị và cấu trúc lại khi bạn nhận ra tại sao chúng là một ý tưởng tồi!