Gli accessor e i modificatori (ovvero setters e getter) sono utili per tre ragioni principali:
- Limitano l'accesso alle variabili.
- Ad esempio, è possibile accedere a una variabile, ma non modificata.
- Convalidano i parametri.
- Potrebbero causare alcuni effetti collaterali.
Università, corsi online, tutorial, articoli di blog ed esempi di codice sul web sottolineano l'importanza degli accessori e dei modificatori, che oggi sembrano quasi un "must" per il codice. Quindi li puoi 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 più modificatori utili, quelli che effettivamente convalidano i parametri e lanciano 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 in questo caso, non vedo quasi mai i modificatori chiamati da un costruttore, quindi l'esempio più comune di una classe semplice con cui ho a che fare è:
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;
}
}
Nella tua esperienza vedi uno schema simile o sono solo sfortunato? E se lo fai, allora cosa pensi che sta causando questo? C'è un evidente svantaggio nell'usare i modificatori dei costruttori o sono considerati solo più sicuri? È qualcos'altro?