Phương thức default được Java giới thiệu từ phiên bản Java 8 để enable khả năng mở rộng, cải tiến một interface đã tồn tại mà không làm phá vỡ những class đã hiện thực interface đó trước đó. Cụ thể nó như thế nào, trong bài viết này chúng ta hãy cùng nhau tìm hiểu nhé các bạn!
OK, hãy bắt đầu bằng ví dụ sau.
Ví dụ, giờ mình có một interface như sau:
1 2 3 4 5 |
package com.huongdanjava; public interface SayHello { void say(); } |
Một class implement interface SayHello trên:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava; public class SayHelloImpl implements SayHello { @Override public void say() { System.out.println("Hello"); } } |
Và class sử dụng:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Example { public static void main(String[] args) { SayHello sayHello = new SayHelloImpl(); sayHello.say(); } } |
Kết quả:
Bây giờ, sẽ như thế nào nếu mình muốn mở rộng interface SayHello bằng cách thêm mới một phương thức như sau:
1 2 3 4 5 6 |
package com.huongdanjava; public interface SayHello { void say(); void print(); } |
Lúc này, một lỗi compile sẽ xuất hiện ngay trong class SayHelloImpl:
Giả sử rằng, chúng ta không thể chỉnh sửa class SayHelloImpl vì hiện tại nó đang được sử dụng ở một nơi khác trong ứng dụng của chúng ta. Vậy cách giải quyết ở đây là gì?
Đây chính là lý do để phương thức default trong interface được giới thiệu từ Java 8 trở lên. Với phương thức default, chúng ta có thể thêm nhiều phương thức vào một interface bất kỳ với implementation bên trong, giúp cho việc mở rộng, cải tiến interface đó sẽ không làm phá vỡ hệ thống đang tồn tại.
Trong ví dụ trên, mình có thể sử dụng phương thức default với phương thức print() như sau:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava; public interface SayHello { void say(); default public void print() { System.out.println("Print Hello"); } } |
Kết quả: