Mục lục
Từ phiên bản Java 9 trở đi chúng ta được phép sử dụng private method trong interface. Đây là một trong số những tính năng mới được giới thiệu trong phiên bản Java lần này.
Để hiểu rõ hơn về quá trình này, chúng ta sẽ cùng nhau nhìn lại các tính năng của Interface qua từng phiên bản Java 7, 8 và 9.
Interface trong Java 7
Trong Java 7 và các phiên bản trở về trước, khái niệm về interface rất đơn giản. Nó chỉ chứa 2 thứ bên trong:
- Constant variable
- Abstract method
Các biến và method được khai báo bên trong interface mặc định sẽ là các hằng số và abstract method. Chúng ta không thể triển khai mã nguồn bên trong một method của interface.
public interface DBLogging{ String MONGO_DB_NAME = "ABC_Mongo_Datastore"; String NEO4J_DB_NAME = "ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; void logInfo(String message); void logWarn(String message); void logError(String message); void logFatal(String message); }
Interface trong Java 8
Trong Java 8, interface được bổ sung 2 tính năng mới là Default method và Static method cho phép triển khai mã nguồn bên trong chúng. Tổng kết lại interface trong phiên bản này có các tính năng:
- Constant variables
- Abstract methods
- Default methods
- Static methods
public interface DBLogging{ String MONGO_DB_NAME = "ABC_Mongo_Datastore"; String NEO4J_DB_NAME = "ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; // abstract method example void logInfo(String message); // default method example default void logWarn(String message){ // Step 1: Connect to DataStore // Step 2: Log Warn Message // Step 3: Close the DataStore connection } default void logError(String message){ // Step 1: Connect to DataStore // Step 2: Log Error Message // Step 3: Close the DataStore connection } default void logFatal(String message){ // Step 1: Connect to DataStore // Step 2: Log Fatal Message // Step 3: Close the DataStore connection } // static method example static boolean isNull(String str) { System.out.println("Interface Null Check"); return str == null ? true : "".equals(str) ? true : false; } // Any other abstract, default, static methods }
Bạn có nhận thấy sự dư thừa mã trong tất cả các hàm log không? Tất cả các method đều mở và đóng kết nối database. Nếu chúng ta muốn tăng tính reuse code thfi bắt buộc chúng ta phải triển khai thêm một commom method dùng chung. Tuy nhiên mặc định method này là public nên các class bên ngoài có thể truy cập được.
Điều này dẫn đến một điểm bất lợi, vì những commom method này chúng ta không muốn bên ngoài sử dụng được.
Interface trong Java 9
Java 9 giới thiệu thêm 2 tính năng mới trong interface là private method và private static method. Kể từ Java 9 trở đi, interface sẽ có các chức năng sau:
- Constant variables
- Abstract methods
- Default methods
- Static methods
- Private methods
- Private Static methods
Private method giải quyết được vấn đề trên của chúng ta, cho phép tạo ra các commom method sử dụng chung và nội bộ. Bên ngoài không thể sử dụng những method này với từ khóa private được cung cấp/
public interface DBLogging { String MONGO_DB_NAME = "ABC_Mongo_Datastore"; String NEO4J_DB_NAME = "ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; default void logInfo(String message) { log(message, "INFO"); } default void logWarn(String message) { log(message, "WARN"); } default void logError(String message) { log(message, "ERROR"); } default void logFatal(String message) { log(message, "FATAL"); } private void log(String message, String msgPrefix) { // Step 1: Connect to DataStore // Step 2: Log Message with Prefix and styles etc. // Step 3: Close the DataStore connection } // Any other abstract, static, default methods }
Các quy tắc sử dụng private method
- Các private method phải được định nghĩa với private modifier.
- Private modifier không đi cùng với abstract.
- Private method phải chứa mã triển khai bên trong vì những method này không thể truy cập từ bên ngoài cũng như triển khai chúng.
Nguồn tham khảo
https://www.journaldev.com/12850/java-9-private-methods-interfaces
https://www.geeksforgeeks.org/private-methods-java-9-interfaces/