Tứ trụ làm điểm nhấn cho ngôn ngữ lập trình hướng đối tượng Java là 4 đặc tính: trừu tượng (abstraction), đóng gói (encapsulation), đa hình (polymorphism) và kế thừa (inheritance).
Với người mới học Java, việc nhắc đến các đặc tính hướng đối tượng như trên sẽ khiến các bạn bối rối. Nhưng đây chỉ là trạng thái ban đầu... và sau khi trải qua code vài project, bạn sẽ hiểu rõ các đặc tính này và biết khi nào nên sử dụng chúng.
Hãy xem đoạn code ví dụ dưới đây:
1.
class Person{ // Trường hợp này sẽ ẩn đi các biến trung gian
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.
private void swap(int[]arr,int m, int n){ // Trường hợp này là ẩn một hàm
int temp=arr[m];
arr[m]=arr[n];
arr[n]=temp;
}
3.
public class JavaTest {
public static void main(String[] args) {
Person p1=Person.getPersonInstance();
}
}
class Person{ // Trường hợp này thiết lập thuộc tính chỉ đọc và ẩn đi thuộc tính ghi
private Person(){}
public static Person getPersonInstance(){
return new Person();
}
}
Tính đóng gói (encapsulation) là gì và khi nào nên sử dụng?
Định nghĩa đơn giản thế này: Trong một class, việc chúng ta ẩn đi (khai báo private, protected) cho các thuộc tính và thay vào đó chỉ cho sử dụng công khai (khai báo public) các phương thức.
Các coder thường sử dụng nguyên tắc đóng gói trong các trường hợp như sau:
Muốn làm gọn một class: Nếu như bạn luôn khai báo public cho tất cả các biến, thuộc tính, phương thức, hàm… thì khi cần sử dụng một class sẽ có rất nhiều đối tượng không cần thiết phải hiển thị.
Muốn ẩn đi sự phước tạp của các đối tượng: Nếu như bạn là một người lập trình thư viện và sau khi hoàn thành sẽ bàn giao thư viện này để cho các bộ phận khác. Việc ẩn đi các thuộc tính, phương thức, hàm…phức tạp, dễ gây xung đột sẽ tạo độ an toàn nhất định cho các đoạn code.
Muốn đơn giản hóa việc thiết lập giá trị cho các biến, phương thức: Thay vì lần lượt thiết lập một tá các giá trị cho một class. Ví dụ như: thanhpho = “Hồ Chí Minh”; quan = “Bình Thạnh”; Phuong = “22”… Nhưng khi sử dụng nguyên tắc đóng gói, chúng ta chỉ cần thiết lập đơn giản như sau: DiaChi(“Hồ Chí Minh”, “Bình Thạnh”, “22”) ;.
Muốn ngăn chặn việc khai thác trái phép các thư viện: Ngoài ra, các các thuộc tính, phương thức, hàm… mà nguy cơ gây ảnh hưởng tiêu cực đến dữ liệu là lớn, có nguy cơ gây sụp đổ hệ thống thì việc sử dụng nguyên tắc đóng gói sẽ làm cho project đạt được mức độ bảo mật và an toàn cao.
3 trường hợp sử dụng nguyên tắc đóng gói
Đóng gói các thuộc tính: Thiết lập (private) cho các biến thành viên cần ẩn đi và các biến cần công khai (public).
Đóng gói phương thức: Một số phương thức được thiết lập private để sử dụng trong nội bộ lớp và không cần công khai.
Đóng gói hàm: Thiết lập private để ngăn chặn các lớp khác truy cập vào, phòng ngừa xung đột code.
Lợi ích của việc sử dụng nguyên tắc đóng gói
Quy trình và hệ thống hóa công tác truy cập dữ liệu, đảm bảo tính thống nhất cho toàn bộ project.
Ẩn đi các chi tiết cách triển khai, khai thác dữ liệu nhạy cảm.
Giúp dễ dàng sửa đổi và bảo trì code.