Средства доступа и модификаторы (также известные как сеттеры и геттеры) полезны по трем основным причинам:
- Они ограничивают доступ к переменным.
- Например, переменная может быть доступна, но не может быть изменена.
- Они проверяют параметры.
- Они могут вызвать некоторые побочные эффекты.
Университеты, онлайн-курсы, учебные пособия, статьи в блогах и примеры кода в Интернете - все подчеркивают важность методов доступа и модификаторов, в настоящее время они почти чувствуют себя необходимыми для кода. Таким образом, их можно найти, даже если они не предоставляют никаких дополнительных значений, как в приведенном ниже коде.
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;
}
}
Видите ли вы похожую модель в своем опыте или мне просто не повезло? И если вы это сделаете, то как вы думаете, что вызывает это? Есть ли очевидный недостаток в использовании модификаторов из конструкторов или они просто считаются более безопасными? Это что-то еще?