https://www.w3schools.com/java/java_encapsulation.asp
Encapsulation
Ý 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 lớp dưới dạng
private
- cung cấp các phương thức lấy và đặt công khai để truy cập và cập nhật giá trị của một
private
biến
Get và Set
Bạn đã học từ chương trước rằng private
các biến chỉ có thể được truy cập trong cùng một lớp (một 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 .
Các get
phương pháp trả về giá trị biến, và các set
bộ phương pháp 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 của biến, với chữ cái đầu tiên viết hoa:
Thí 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;
}
}
Giải thích ví dụ
Các get
phương thức trả về giá trị của biến name
.
Các set
phương pháp có một tham số ( newName
) và gán nó vào name
biến. Các this
từ khóa được sử dụng để tham khảo các đối tượng hiện hành.
Tuy nhiên, vì name
biến được khai báo là private
, chúng ta không thể truy cập nó từ bên ngoài lớp này:
Thí 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ả sau:John
Tuy nhiên, khi chúng tôi cố gắng truy cập một private
biến, 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 tôi sử dụng các phương thức getName()
và setName()
để truy cập và cập nhật biến:
Thí 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
- Các thuộc tính lớp có thể được đặt ở chế độ chỉ đọc (nếu bạn chỉ sử dụng
get
phương thức) hoặc chỉ ghi (nếu bạn chỉ sử dụngset
phương thức) - Linh hoạt: lập trình viên có thể thay đổi một phần của mã mà không ảnh hưởng đến các phần khác
- Tăng cường bảo mật dữ liệu