Akcesoria i modyfikatory (znane również jako setery i gettery) są przydatne z trzech głównych powodów:
- Ograniczają dostęp do zmiennych.
- Na przykład można uzyskać dostęp do zmiennej, ale nie można jej modyfikować.
- Sprawdzają poprawność parametrów.
- Mogą powodować pewne działania niepożądane.
Uniwersytety, kursy online, samouczki, artykuły na blogach i przykłady kodu w Internecie kładą nacisk na znaczenie akcesoriów i modyfikatorów, które w dzisiejszych czasach są niemal „obowiązkowe” dla kodu. Można je więc znaleźć, nawet jeśli nie dostarczają żadnej dodatkowej wartości, jak na przykład poniższy kod.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
To powiedziawszy, bardzo często można znaleźć bardziej przydatne modyfikatory, te, które faktycznie sprawdzają parametry i rzucają wyjątek lub zwracają wartość logiczną, jeśli podano nieprawidłowe dane wejściowe, coś takiego:
/**
* 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;
}
Ale nawet wtedy prawie nigdy nie widzę, aby modyfikatory były wywoływane z konstruktora, więc najczęstszym przykładem prostej klasy, z którą mam do czynienia, jest:
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;
}
}
Ale można by pomyśleć, że to drugie podejście jest znacznie bezpieczniejsze:
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;
}
}
Czy widzisz podobny wzorzec w swoim doświadczeniu, czy tylko ja mam pecha? A jeśli tak, to co według ciebie jest przyczyną? Czy jest oczywista wada używania modyfikatorów konstruktorów, czy też są one po prostu uważane za bezpieczniejsze? Czy to coś innego?