Bài tập

Tính đóng gói (Encapsulation) trong Java

Huy Erick

Trong lập trình hướng đối tượng, chúng ta có 4 tính chất chính đó là tính đóng gói (Encapsulation), tính kế thừa (Inheritance), tính đa hình (Polymorphism) và tính trừu tượng (Abstraction). Trong bài này,...

Trong lập trình hướng đối tượng, chúng ta có 4 tính chất chính đó là tính đóng gói (Encapsulation), tính kế thừa (Inheritance), tính đa hình (Polymorphism) và tính trừu tượng (Abstraction). Trong bài này, tôi sẽ giới thiệu đến các bạn tính chất cơ bản đầu tiên đó là tính đóng gói (Encapsulation) trong Java và cách vận dụng tính chất này trong lập trình.

1. Khái niệm tính đóng gói

Trong bài trước, tôi đã đưa ra một số ví dụ về việc truy cập trực tiếp đến thuộc tính của đối tượng trong một lớp thông qua tên của thuộc tính đó. Tuy nhiên, chúng ta nên hạn chế sử dụng cách này vì nó không đảm bảo một trong những nguyên tắc quan trọng nhất của lập trình hướng đối tượng đó là tính bảo mật và che giấu thông tin. Vì vậy, để khắc phục, trong lập trình hướng đối tượng có một tính chất có thể cho phép chúng ta truy cập và thay đổi giá trị thuộc tính thông qua các phương thức của lớp đó là tính đóng gói (Encapsulation).

Vậy đóng gói là gì? Đóng gói là sự che giấu bên trong dữ liệu riêng của mỗi đối tượng của lớp được khai báo và chỉ được truy xuất thông qua hệ thống các phương thức có sẵn của lớp (chỉ có thể gọi những phương thức có sẵn của lớp). Vì vậy, nó còn được gọi là data hiding (nghĩa là che giấu dữ liệu).

Tính đóng gói có những đặc điểm như sau:

  • Tạo ra cơ chế để ngăn ngừa việc gọi phương thức của lớp này tác động hay truy xuất dữ liệu của đối tượng thuộc về lớp khác.
  • Dữ liệu riêng (khi được khai báo là private) của mỗi đối tượng được bảo vệ khỏi sự truy xuất không hợp lệ từ bên ngoài.
  • Người lập trình có thể dựa vào cơ chế này để ngăn ngừa việc gán giá trị không hợp lệ vào thành phần dữ liệu của mỗi đối tượng.
  • Cho phép thay đổi cấu trúc bên trong của một lớp mà không làm ảnh hưởng đến những lớp bên ngoài có sử dụng lớp đó.

Để cài đặt tính đóng gói, chúng ta có 2 bước như sau:

  1. Khai báo các thuộc tính của đối tượng trong lớp là private để các lớp khác không thể truy cập trực tiếp/sửa đổi được.
  2. Cung cấp các phương thức getter/setter có phạm vi truy cập là public để truy cập và sửa đổi các giá trị của thuộc tính trong lớp. Phương thức getter là phương thức truy cập vào thuộc tính của đối tượng và trả về các thuộc tính của đối tượng, còn phương thức setter là phương thức truy cập vào thuộc tính của đối tượng và gán giá trị cho các thuộc tính của đối tượng đó.

2. Ví dụ về tính đóng gói

Dưới đây là một ví dụ minh họa tính đóng gói trong Java:

public class Person {     private String name;     private int age;      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getAge() {         return age;     }      public void setAge(int age) {         this.age = age;     } }

Kết quả sau khi biên dịch chương trình:

Trong lớp Person, chúng ta có đoạn code như sau:

public class Person {     private String name;     private int age;      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getAge() {         return age;     }      public void setAge(int age) {         this.age = age;     } } 

Trong đoạn code trên, chúng ta sử dụng từ khóa this để truy cập các thuộc tính của đối tượng và phân biệt giữa biến địa phương và thuộc tính của lớp. Từ khóa this có ý nghĩa là một tham chiếu đặc biệt chiếu tới đối tượng chủ của phương thức hiện hành.

Lưu ý: Để tạo nhanh phương thức getter/setter của các thuộc tính trong lớp, chúng ta có thể sử dụng tính năng "Generate Getters and Setters" của các IDE như Eclipse.

3. Lời kết

Trong bài này, chúng ta đã tìm hiểu về tính đóng gói trong Java. Tính đóng gói là một tính chất quan trọng trong lập trình hướng đối tượng, giúp bảo vệ dữ liệu và tạo ra cơ chế truy cập an toàn cho các thuộc tính của đối tượng. Hãy tiếp tục theo dõi bài viết tiếp theo, chúng ta sẽ tìm hiểu về tính kế thừa trong lập trình hướng đối tượng.

1