Bộ truy cập và bộ sửa đổi (còn gọi là setters và getters) hữu ích vì ba lý do chính:
- Họ hạn chế quyền truy cập vào các biến.
- Ví dụ, một biến có thể được truy cập, nhưng không được sửa đổi.
- Họ xác nhận các tham số.
- Chúng có thể gây ra một số tác dụng phụ.
Các trường đại học, khóa học trực tuyến, hướng dẫn, bài viết trên blog và ví dụ mã trên web đều nhấn mạnh về tầm quan trọng của người truy cập và người sửa đổi, họ gần như cảm thấy như là "phải có" cho mã hiện nay. Vì vậy, người ta có thể tìm thấy chúng ngay cả khi chúng không cung cấp bất kỳ giá trị bổ sung nào, như mã bên dưới.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
Điều đó đã được nói, rất phổ biến để tìm các công cụ sửa đổi hữu ích hơn, những công cụ thực sự xác nhận các tham số và đưa ra một ngoại lệ hoặc trả về một boolean nếu đầu vào không hợp lệ đã được cung cấp, đại loại như sau:
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
Nhưng ngay cả khi đó, tôi hầu như không bao giờ thấy các bộ sửa đổi được gọi từ một hàm tạo, vì vậy ví dụ phổ biến nhất của một lớp đơn giản mà tôi phải đối mặt là:
public class Cat {
private int age;
public Cat(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
}
Nhưng người ta sẽ nghĩ rằng cách tiếp cận thứ hai này an toàn hơn rất nhiều:
public class Cat {
private int age;
public Cat(int age) {
//Use the modifier instead of assigning the value directly.
setAge(age);
}
public int getAge() {
return this.age;
}
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
}
Bạn có thấy một mô hình tương tự trong kinh nghiệm của bạn hay chỉ là tôi không may mắn? Và nếu bạn làm vậy, thì bạn nghĩ điều gì gây ra điều đó? Có một bất lợi rõ ràng cho việc sử dụng các sửa đổi từ các nhà xây dựng hoặc chúng chỉ được coi là an toàn hơn? Có phải cái gì khác không?