Ajuda com getters e setters

4 respostas
A
Porque fazemos esse código:
private int var;

public void setVar(int var) {
     this.var = var;
}

public int getVar() {
     return var;
}
Ao invés de simplesmente fazer esse:
public int var;
Pra mim os dois dão no mesmo.

4 Respostas

J
Ascy:
Porque fazemos esse código:
private int var;

public void setVar(int var) {
     this.var = var;
}

public int getVar() {
     return var;
}
Ao invés de simplesmente fazer esse:
public int var;
Pra mim os dois dão no mesmo.

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.

A

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.

J

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.

L

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.

Criado 5 de agosto de 2015
Ultima resposta 17 de ago. de 2015
Respostas 4
Participantes 3