Encapsulation

Duy Văn | 11/03/2025


Encapsulation - hay còn gọi là tính đóng gói là một trong những tính chất cơ bản nhất của OOP nói chung. Đóng gói ở đây bao gồm các nội dung sau:

  • Gói tất cả dữ liệu và các hàm để làm việc với dữ liệu vào trong một vỏ bọc, đây chính là object
  • Vỏ bọc này bảo vệ dữ liệu, giấu nó khỏi sự truy cập từ bên ngoài, chỉ có thể truy cập thông qua các phương thức đặc biệt được bảo mật

Để vỏ bọc này bảo vệ các dữ liệu thì các dữ liệu ở trong class sẽ được khai báo với access modifier là private, tức là chỉ có thể truy cập trực tiếp vào các thuộc tính này từ trong class

Phương thức để truy cập các dữ liệu này từ bên ngoài chính là càc method get và set, để lấy và gán giá trị cho các thuộc tính, các method này không bị gán modifier private

Ví dụ:

public class Person{
  private String name;
  private int age;
  private String address;

  public String getName(){
    ;
  }

  public void setName(String name){
    this.name = name;
  }
}

Giả sử nếu chúng ta khởi tạo một object, thì không thể nào sử dụng myobj.name để truy cập thuộc tính mà chúng ta sẽ gọi myobj.getName() để lấy giá trị của thuộc tính name

Encapsulation không chỉ đơn thuần là đặt access modifier và các method get set để làm việc với dữ liệu gói trong object, bản chất nó là một concept rất rộng

Ý tưởng của Encapsulation khi ứng dụng vào lập trình hiện đại là để tạo ra một giao diện, cung cấp tới cho người dùng khả năng truy suất các dữ liệu của class, để mà khi chúng ta cần thay đổi cấu trúc dữ liệu thì nó không hề ảnh hưởng đến cách người dùng sử dụng cũng như truy suất dữ liệu, để ví dụ thì hãy thử cân nhắc tình huống dưới đây:

Chúng ta có một class không ứng dụng encapsulation

public class Person{
  public String name;
  public int age;
  public String address;
}

Khi này ,các dev làm việc với class sẽ truy suất dữ liệu của object bằng cách gọi thẳng tên các thuộc tính, muốn lấy tên thì myobj.name, muốn lấy tuổi thì myobj.age, muốn lấy địa chỉ thì myobj.address,… Kết quả là đến một ngày đẹp trời, cấu trúc trên thay đổi, chúng ta cần thêm một thuộc tính mới, hoặc thay đổi tên của một thuộc tính, thì tất cả các dev sử dụng class này sẽ phải thay đổi tất cả các phần code mà họ đã viết, điều này là không hiệu quả

Ngược lại, với một class có ứng dụng Encapsulation


public class Person{
  private String name;
  private int age;
  private String address;

  public String getName(){
    ;
  }

  public void setName(String name){
    this.name = name;
  }
}

Khi này, kể cả khi cấu trúc dữ liệu thay đổi, chúng ta chỉ cần thay đổi cách các method get set hoạt động, chứ còn từ bên ngoài class, các dev sẽ không cần thay đổi cách gọi các method này

Khái niệm Encapsulation cũng liên quan và gắn liền với Abstraction