Tính đóng gói trong java cho phép chúng ta liên kết trạng thái(thuộc tính) hành vi(method) của object lại với nhau. Như việc bạn tạo một class trong java chính là lúc bạn áp dụng tính đóng gói.
Ý tưởng chính của tính đóng gói là ẩn đi các chi tiết triển khai khỏi người dùng. Nếu một thành phần dữ liệu là private có nghĩa là nó chỉ được truy cập trong cùng một class, các class bên ngoài sẽ không thể truy cập được.
Các thành phần private có thể truy cập thông qua các method public trong class, do đó mà các thành phần private sẽ được ẩn đi khỏi các class bên ngoài.
Ví dụ: Chúng ta có class EncapsulationDemo chứa thuộc tính age. Chúng ta không muốn các class bên ngoài tuỳ tiện truy cập age. Vì thế chúng ta sẽ cung cấp 2 method public để gán và lấy giá trị age.
// File EncapsulationDemo.java public class EncapsulationDemo{ private age; public int getAge(){ return empAge; } public void setAge(int age){ this.age = age; } } // File Main.java public class Main { public static void main(String args[]){ EncapsulationDemo obj = new EncapsulationDemo(); obj.setAge(18); System.out.println(obj.getAge); } }
Output: 18
Từ khoá private đi trước thuộc tính age public trước method getAge(),. setAge() được gọi là Access modifiers mà chúng ta sẽ tìm hiểu ở bài sau.
- Private: Chỉ class chứa nó truy cập, bên ngoài không thể truy cập age.
- Public: Bất kỳ nơi đâu cũng có thể truy cập được.
Read-only class
Đôi khi chúng ta có nhu cầu tạo một class chỉ cho phép đọc dữ liệu chứ không được phép thay đổi giá trị các thuộc tính trong class. Được gọi là Read-only class.
public class Student { private String college = "KHTN"; public String getCollege() { return college; } }
Với thiết kế của class Student, thì chúng ta sẽ không tài nào mà sửa đổi được tên trường của student đúng không nào.
Write-only class
Write-only class là class chỉ cho phép thay đổi giá trị của các thuộc tính. Không được phép lấy giá trị của các thuộc tính ra sử dụng.
public class Student { private String college = "KHTN"; public String setCollege(String college) { this.college = college; } }
Dựa vào việc ẩn đi thuộc tính của class và chỉ cho phép truy xuất qua các method public, chúng ta có thể làm một số thao tác nếu cần thiết, mà các class bên ngoài sẽ không thể can thiệp được.
Ví dụ: Lấy class Student ở trên, mỗi lần setCollege() mình sẽ cần đến số lần đổi tên.
public class Student { private String college = "KHTN"; private count = 0; public String setCollege(String college) { this.college = college; count++; } }