Acessores e modificadores (também conhecidos como setters e getters) são úteis por três razões principais:
- Eles restringem o acesso às variáveis.
- Por exemplo, uma variável pode ser acessada, mas não modificada.
- Eles validam os parâmetros.
- Eles podem causar alguns efeitos colaterais.
Universidades, cursos on-line, tutoriais, artigos de blog e exemplos de código na Web estão todos enfatizando a importância dos acessadores e modificadores, quase parecem um "must have" para o código hoje em dia. Assim, é possível encontrá-los mesmo quando eles não fornecem nenhum valor adicional, como o código abaixo.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
Dito isto, é muito comum encontrar modificadores mais úteis, aqueles que realmente validam os parâmetros e lançam uma exceção ou retornam um booleano se uma entrada inválida foi fornecida, algo como isto:
/**
* 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;
}
Mas mesmo assim, quase nunca vejo os modificadores serem chamados de um construtor, portanto, o exemplo mais comum de uma classe simples com a qual me deparo é:
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;
}
}
Mas alguém poderia pensar que essa segunda abordagem é muito mais segura:
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;
}
}
Você vê um padrão semelhante em sua experiência ou sou apenas eu tendo azar? E se você faz, então o que você acha que está causando isso? Existe uma desvantagem óbvia para o uso de modificadores dos construtores ou eles são apenas considerados mais seguros? É algo mais?