Nguyên tắc đóng gói trong Java có ý nghĩa: một đối tượng sẽ không để các đối tượng bên ngoài có thể truy cập trực tiếp các thuộc tính của đối tượng đó mà phải thông qua các phương thức mà đối tượng đó cho phép.
Ví dụ bên dưới đối tượng Student có hai thuộc tính là name và age, định nghĩa access modifier của 2 thuộc tính này là private, do đó không đối tượng nào bên ngoài đối tượng Student có thể truy cập được. Các đối tượng bên ngoài chỉ có thể truy cập đến chúng thông qua các phương thức get, set.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.huongdanjava; public class Student { 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; } } |
Tại sao cần phải sử dụng nguyên tắc đóng gói
Các thuộc tính private của một đối tượng được sử dụng để ẩn các thông tin về đối tượng đó. Nếu chúng ta không sử dụng nguyên tắc đóng gói, các trạng thái và hành vi của đối tượng sẽ dễ dàng bị các đối tượng khác truy cập và thay đối nếu nó không được đóng gói đúng cách.
Ở ví dụ sau thuộc tính age và name của đối tượng Student được định nghĩa với access modifier là public
1 2 3 4 5 6 7 |
package com.huongdanjava; public class Student { public String name; public int age; } |
do đó các thuộc tính này có thể bị truy cập và thay đổi giá trị dễ dàng từ các đối tượng khác.
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava; public class Example { public static void main(String[] args) { Student student = new Student(); student.name = "Khanh"; student.age = 30; } } |
Sử dụng nguyên tắc đóng gói
Chúng ta sử dụng nguyên tắc đóng gói để quản lý việc các đối tượng khác có thể truy cập đến những thuộc tính nào của đối tượng của chúng ta.
Ở ví dụ sau thuộc tính age của đối tượng Student chỉ có thể được lấy về giá trị từ đối tượng khác chứ không thể thay đối giá trị của nó còn thuộc tính name thì các đối tượng khác có thể thay đối giá trị luôn.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.huongdanjava; public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } } |
Mục đích của nguyên tắc đóng gói là ẩn thông tin của đối tượng. Bằng cách sử dụng các phương thức, chúng ta có thể ngăn chặn các thuộc tính private bị gán giá trị từ các đối tượng khác.
Một đối tượng được đóng gói tốt là một đối tượng mà các thuộc tính của nó đều được định nghĩa với access modifier là private và nó chỉ cho phép các đối tượng khác truy cập các thuộc tính của mình thông qua các phương thức.