Accessoren und Modifikatoren (auch Setter und Getter genannt) sind aus drei Hauptgründen nützlich:
- Sie schränken den Zugriff auf die Variablen ein.
- Zum Beispiel kann auf eine Variable zugegriffen, aber nicht geändert werden.
- Sie validieren die Parameter.
- Sie können einige Nebenwirkungen verursachen.
Universitäten, Online-Kurse, Tutorials, Blog-Artikel und Codebeispiele im Internet betonen die Wichtigkeit der Zugriffs- und Modifizierungsfunktionen. Sie fühlen sich heutzutage fast wie ein "Muss" für den Code an. Man kann sie also auch dann finden, wenn sie keinen zusätzlichen Wert liefern, wie im folgenden Code.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
Es ist jedoch üblich, weitere nützliche Modifikatoren zu finden, die die Parameter tatsächlich validieren und eine Ausnahme auslösen oder einen Booleschen Wert zurückgeben, wenn ungültige Eingaben eingegeben wurden.
/**
* 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;
}
Aber selbst dann sehe ich fast nie, dass die Modifikatoren von einem Konstruktor aufgerufen wurden. Das häufigste Beispiel für eine einfache Klasse, mit der ich konfrontiert bin, ist das folgende:
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;
}
}
Aber man würde denken, dass dieser zweite Ansatz viel sicherer ist:
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;
}
}
Sehen Sie ein ähnliches Muster in Ihrer Erfahrung oder bin es nur ich, der Pech hat? Und wenn ja, was ist Ihrer Meinung nach der Grund dafür? Gibt es einen offensichtlichen Nachteil bei der Verwendung von Modifikatoren der Konstrukteure oder werden sie nur als sicherer angesehen? Ist es etwas anderes