Gli accessori e i modificatori (ovvero setter e getter) sono utili per tre motivi principali:
- Limitano l'accesso alle variabili.
- Ad esempio, è possibile accedere a una variabile, ma non modificata.
- Convalidano i parametri.
- Possono causare alcuni effetti collaterali.
Università, corsi online, tutorial, articoli di blog ed esempi di codice sul web sottolineano l'importanza degli accessor e dei modificatori, al giorno d'oggi sembrano quasi un "must" per il codice. Quindi si possono trovare anche quando non forniscono alcun valore aggiuntivo, come il codice qui sotto.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
Detto questo, è molto comune trovare modificatori più utili, quelli che effettivamente convalidano i parametri e generano un'eccezione o restituiscono un valore booleano se è stato fornito un input non valido, qualcosa del genere:
/**
* 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;
}
Ma anche allora, non vedo quasi mai i modificatori chiamati da un costruttore, quindi l'esempio più comune di una semplice classe che devo affrontare è questo:
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;
}
}
Ma si potrebbe pensare che questo secondo approccio sia molto più sicuro:
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;
}
}
Vedi uno schema simile nella tua esperienza o sono solo io a essere sfortunato? E se lo fai, cosa pensi che stia causando? Esiste un evidente svantaggio nell'uso dei modificatori dai costruttori o sono considerati più sicuri? È qualcos'altro?