Los accesorios y modificadores (también conocidos como setters y getters) son útiles por tres razones principales:
- Restringen el acceso a las variables.
- Por ejemplo, se puede acceder a una variable, pero no modificarla.
- Validan los parámetros.
- Pueden causar algunos efectos secundarios.
Las universidades, los cursos en línea, los tutoriales, los artículos de blog y los ejemplos de códigos en la web hacen hincapié en la importancia de los accesores y modificadores, casi se sienten como un "must have" para el código hoy en día. Entonces uno puede encontrarlos incluso cuando no proporcionan ningún valor adicional, como el código a continuación.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
Dicho esto, es muy común encontrar modificadores más útiles, aquellos que realmente validan los parámetros y arrojan una excepción o devuelven un valor booleano si se ha proporcionado una entrada no válida, algo como esto:
/**
* 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;
}
Pero incluso entonces, casi nunca veo que los modificadores se hayan llamado desde un constructor, por lo que el ejemplo más común de una clase simple que enfrento es este:
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;
}
}
Pero uno pensaría que este segundo enfoque es mucho más seguro:
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;
}
}
¿Ves un patrón similar en tu experiencia o solo soy yo desafortunado? Y si lo haces, ¿qué crees que está causando eso? ¿Existe una desventaja obvia para usar modificadores de los constructores o simplemente se consideran más seguros? ¿Es algo más?