Аксесуари та модифікатори (також сетери та геттери) корисні з трьох основних причин:
- Вони обмежують доступ до змінних.
- Наприклад, змінна може бути доступна, але не змінюватися.
- Вони підтверджують параметри.
- Вони можуть викликати деякі побічні ефекти.
Університети, онлайн-курси, навчальні посібники, статті в блогах та приклади коду в Інтернеті все наголошують на важливості аксесуарів та модифікаторів, вони майже відчувають себе як "обов'язкові" для цього коду. Тож їх можна знайти навіть тоді, коли вони не надають додаткового значення, як-от код нижче.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = 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;
}
Але навіть тоді я майже ніколи не бачу, щоб модифікатори викликали конструктор, тому найпоширеніший приклад простого класу, з яким я стикаюся, це такий:
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;
}
}
Але можна подумати, що цей другий підхід набагато безпечніший:
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;
}
}
Ви бачите подібний зразок у своєму досвіді чи це просто мені не пощастило? А якщо так, то, на вашу думку, це спричиняє це? Чи є очевидний недолік використання модифікаторів від конструкторів або вони просто вважаються безпечнішими? Це щось інше?