private int var;
public void setVar(int var) {
this.var = var;
}
public int getVar() {
return var;
}
public int var;
private int var;
public void setVar(int var) {
this.var = var;
}
public int getVar() {
return var;
}
public int var;
Porque fazemos esse código:Ao invés de simplesmente fazer esse:private int var; public void setVar(int var) { this.var = var; } public int getVar() { return var; }Pra mim os dois dão no mesmo.public int var;
Amigo,
Leia um pouco sobre Orientação a Objetos.
Tente entender sobre Encapsulamento.
Tem leituras técnicas que te mostram com exemplos o porque de usar getters e setters.
Depois que entender, leia este artigo da Caelum: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/
Acredito que ira sanar suas dúvidas.
Valeu.
Mas o problema não é com orientação a objetos ou encapsulamento, e sim com esse exemplo em especifico. Vejo isso em muitos lugares e quero saber se realmente é necessário criar getter e setter neste caso ao invés de simplesmente deixar a variável publica.
São dois casos diferentes. Quando as pessoas usam o private, é para proteger o encapsulamento. As classes que herdam da classe pai, só poderão inicializar suas variáveis através do get e do set. Você não consegue inicializar direto, pois só a classe pai enxerga esse atributo. por isso o setVar(“variavel”).
No outro caso, qualquer classe-filha que extenda da classe-pai, poderá chamar o atributo variável, inicializando e mudando o comportamento da classe da maneira que bem entender. c.var(“variavel”). A partir desse momento, o valor será atribuído a variável.
Na verdade sua duvida eh basicamente encapsulamento e OO.
Primeiramente considere que encapsulamento eh basico de OO e de boas praticas de programação.
Agora imagine que vc tenha uma classe que a funcao dela eh pegar dois numeros inteiros e reais maiores do que zero e soma-los.
Voce tem como regra que os numeros devem ser maiores do que zero. E que deve ser retornado a soma destes.
import NumeroMenorQueZeroException;
public class SomaReal {
int n1;
int n2;
public SomaReal(int n1, int n2) {
setN1(n1);
setN2(n2);
}
public SomaReal() {
this(1,1);
}
public final void setN1(int n1) throws NumeroMenorQueZeroException {
this.n1=valida(n1);
}
public final void setN2(int n2) throws NumeroMenorQueZeroException {
this.n2=valida(n2);
}
public int getN1() {
return this.n1;
}
public int getN2() {
return this.n2;
}
public int valida(int num) throws NumeroMenorQueZeroException {
try {
if (num<0) throw new NumberoMenorQueZeroException("Os numeros devem ser maiores do que zero.");
} finally {
return (num<0)?1:num;
}
}
public int soma(int n1,int n2){
return n1+n2;
}
}
No codigo acima eu garanto que os numeros sejam sempre maiores do que zero. Que eh minha regra. Mesmo que se tente entrar com numero menor do que zero. O metodo valida garante que nesse caso seja gerado o valor 1.
Se ao tentar atribuir valores a n1 e n2. É chamado o metodo “valida” A classe se encarrega de colocar valores validos (o valor 1) no campo. E gera uma exceção criada por mim mesmo NumeroMenorQueZeroException. Essa exceção eh novamente jogada pelo setn1 e setN2 com uma mensagem informando o erro.
Ai quando voce tenta atribuir os dados, voce trata esta exceção.
Este eh um exemplo de como validar os dados.
Se voce colocar n1 e n2 como public. Voce nao tem como prever que tipos de dados vao ser inseridos em n1 e n2. Pois o user tem acesso direto a variavel.
Esse tipo de comportamento “imprevisto” pode comprometer o funcionamento de sua classe. Principalmente em casos mais complexos. Ja que aqui eh apenas um exemplo bobo.
O objetivo do encapsulamento eh proteger seus dados e garantir que sua classe funcione.
Eu declarei os sets como final pois nao quero que ao ser herdados, sejam sobrescritos.
Alem disso os sets e gets são um padrao usado na linguagem que facilita leitura e manutenção do código. Facilita outros programadores utilizarem sua classe. Enfim sao varias vantagens.