Đóng gói Java
đóng gói
Ý nghĩa của Encapsulation là đảm bảo rằng dữ liệu "nhạy cảm" được ẩn khỏi người dùng. Để đạt được điều này, bạn phải:
- khai báo các biến/thuộc tính của lớp là
private
- cung cấp các phương thức get và set công khai để truy cập và cập nhật giá trị của biến
private
Nhận và đặt
Bạn đã học từ chương trước rằng các biến private
chỉ có thể được truy cập trong cùng một lớp (lớp bên ngoài không có quyền truy cập vào nó). Tuy nhiên, có thể truy cập chúng nếu chúng tôi cung cấp các phương thức get và set công khai.
Phương thức get
trả về giá trị biến và phương thức set
đặt giá trị.
Cú pháp cho cả hai là chúng bắt đầu bằng get
hoặc set
, theo sau là tên biến, với chữ cái đầu tiên viết hoa:
Ví dụ
public class Person { private String name; // private = restricted access // Getter public String getName() { return name; } // Setter public void setName(String newName) { this.name = newName; } }
Ví dụ giải thích
Phương thức get
trả về giá trị của name
biến.
Phương thức set
lấy một tham số ( newName
) và gán nó cho biến name
. Từ khóa this
được sử dụng để chỉ đối tượng hiện tại.
Tuy nhiên, vì biến name
được khai báo là private
nên chúng ta không thể truy cập nó từ bên ngoài lớp này:
Ví dụ
public class Main { public static void main(String[] args) { Person myObj = new Person(); myObj.name = "John"; // error System.out.println(myObj.name); // error } }
Nếu biến được khai báo là public
, chúng ta sẽ mong đợi kết quả như sau:
John
Tuy nhiên, khi cố gắng truy cập vào một biến private
, chúng tôi gặp lỗi:
MyClass.java:4: error: name has private access in Person
myObj.name = "John";
^
MyClass.java:5: error: name has private access in Person
System.out.println(myObj.name);
^
2 errors
Thay vào đó, chúng ta sử dụng các phương thức getName()
và setName()
để truy cập và cập nhật biến:
Ví dụ
public class Main { public static void main(String[] args) { Person myObj = new Person(); myObj.setName("John"); // Set the value of the name variable to "John" System.out.println(myObj.getName()); } } // Outputs "John"
Tại sao đóng gói?
- Kiểm soát tốt hơn các thuộc tính và phương thức của lớp
- Thuộc tính lớp có thể được đặt ở chế độ chỉ đọc (nếu bạn chỉ sử dụng phương thức
get
) hoặc chỉ ghi (nếu bạn chỉ sử dụng phương thứcset
) - Linh hoạt: lập trình viên có thể thay đổi một phần code mà không ảnh hưởng đến các phần khác
- Tăng cường bảo mật dữ liệu