Private method in Java Interface

Oracle ra phiên bản Java tiếp theo là Java9 vào tháng 4 năm 2017, private method trong Interface là một trong những tính năng mới của Java9. Bài techblog tháng này mình xin giới thiệu tính năng mới này của Java9.

  • Các quy tắc định nghĩa private method trong Interface
  • Tại sao chúng ta lại cần private method trong Interface
  • Lợi ích của private method trong Interface

Trước khi nói về private method trong Interface Java9, chúng ta cùng xem lại "lịch sử" của Interface từ phiên bản Java7

Interface Java7

Interface trong Java7 hay các phiên bản cũ hơn chỉ có 2 yếu tố duy nhất là

  • Constant variables
  • Abstract methods

Nghĩa là ta không thể tạo một method với đầy đủ phần xử lý (body method) trong interface. Ta chỉ có thể thực hiện điều này với Abstract class.

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 Java8

Với Java8, Oracle đã thêm tính năng mới cho Interface là Default methodSatic method

  • Constant variables
  • Abstract methods
  • Default methods
  • Static methods Vậy là ta có thể tạo method với đầy đủ xử lý trong 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";

      default void logInfo(String message){
         Step1: Connect to DataStore
         Setp2: Log Info Message
         Setp3: Close the DataStore connection
      }
      default void logWarn(String message){
         Step1: Connect to DataStore
         Setp2: Log Warn Message
         Setp3: Close the DataStore connection
      }
      default void logError(String message){
         Step1: Connect to DataStore
         Setp2: Log Error Message
         Setp3: Close the DataStore connection
      }
      default void logFatal(String message){
         Step1: Connect to DataStore
         Setp2: Log Fatal Message
         Setp3: Close the DataStore connection  
      }

      // Any other abstract methods
   }

Ở ví dụ trên ta đã tạo những method với đầy đủ phần xử lý (body method). Nhưng nếu để ý chúng ta dễ dàng nhận thấy là có code dư thừa ở interface này. Code bị lặp lại ở các default method. Để loại bỏ sự lặp lại code ở các method thì ta cần viết một common method cho các method đó. Vậy là common method này buộc phải public. Nhưng ta không muốn có thêm public method nào nữa, ta phải làm gì? Interface trong Java8 không giải quyết được vấn đề này, ta chỉ có thể làm việc đó với Abstract class mà thôi.

Interface Java9

Với Java9 ta có thể giải quyết được yêu cầu được đặt ra ở trên (Java8), Oracle đã bổ sung tính năng mới cho Interface là Private methodPrivate static method Vậy là các thành phần trong Interface Java9 gồm:

  • Constant variables
  • Abstract methods
  • Default methods
  • Static methods
  • Private methods
  • Private 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";

      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){
         Step1: Connect to DataStore
         Setp2: Log Message with Prefix and styles etc.
         Setp3: Close the DataStore connection  
      }
      // Any other abstract methods
   }

Giờ ta đã tạo được common method để giải quyết việc code dư thừa, và đặc biệt là phía Client không thể truy cập vào common method này vì nó là private.

Các quy tắc khi tạo Private method trong Interface

Khi tạo các private method trong Interface ta tuân thủ các quy tắc sau:

  • Dùng khóa private để định nghĩ kiểu của method
  • Không có private và abstract private abstract method

Luật này thì không mới. Chúng ta không thể khai báo private abstract method vì privateabstract có ý nghĩa trái ngược nhau: private có nghĩa là phía Client không thể truy cập được, các sub-class không thể override. Còn abstract thì ngược lại, các sub-class nên override nó, Client có thể truy cập nó. Do vậy private method cần được viết đầy đủ phần xử lý (chức năng).

  • Private method bắt buộc có phần thân xử lý
  • Private method không thể chia nhỏ hơn nữa: Nghĩa là private method sẽ xử lý một nghiệp vụ nhỏ nhất, không thể chia nhỏ nó thành những method nhỏ hơn nữa.

Tại sao ta cần Private method trong Interface và Lợi ích của nó là gì

Khi phỏng vấn cho vị trí Java developer ta có thể gặp các câu hỏi về Private method trong Interface như sau:

  • Tại sao chúng ta cần Private method trong Interface?
  • Khi nào thì chúng ta sử dụng Private method trong Interface?
  • Lợi ích của Private method trong Interface là gì?

Chúng ta có thể trả lời ba câu hỏi trên chỉ bằng hai điểm sau:

  • Dùng Private method trong để ta xử lý vấn đề duplicate code trong Interface khi ta viết các default method.
  • Ta có thể chỉ public những method ta muốn cho phía Client xử dụng.

Tài liệu tham khảo