Super básico - Sobre encapsulamento (getter e setter)

Oi gente,

por favor, de dentro classe onde há atributos private e seus respectivos getteres e setters não preciso aliás não devo acessar os atributos via método, certo?

AS

Bem, voce pode acessar os atributos sem usar os métodos, pois está na mesma classe, mas depende do caso, não é recomendado… pois geralmente, os getters/setters servem para colocar alguma validação ao tentar recuperar/setar um valor neles… e se você acessar os atributos fora dos getters/setters estará pulando essas validações…

Mesmo estando dentro da classe? Aliás, desculpe, mas nunca ví validação do getter e setter… Pode me explicar melhor?

os métodos getter e setter servem justamente para encapsular os seus atributos.

O acesso aos atributos de sua classe, deve ser de responsabilidade da classe, nunca sendo feitos diretamente.

Sim, o que o Marcelo quis dizer é que as vezes os atributos sofrem um tratamento dentro do set, ou get, e você pularia este tratamento. Tipo assim:

setPeso(int ps){ if(ps>9){ peso = ps; } }

No caso só é aceito no atributo peso maior que 9. Então se você setar direto, esta validação não aconteceria.

Puxa, agora preciso tentar lembrar um exemplo…

Vejamos… digamos que eu tenha um banco de dados, e eu vou gravar um valor nele através de um bean, que tem um atributo private com um setter e um getter… algum maluco criou uma regra de negócio que diz para setarmos um valor, digamos, "INVÁLIDO caso o valor informado esteja nulo, ou em branco, ou em um formato inválido… posso muito bem fazer isso em outro lugar, se eu estivesse usando um Struts da vida, por exemplo… mas como é uma regra de negócio que deve ser aplicada para esse atributo, não dependendo de onde venha essa informação (de uma página web, de um webservice, de um portal da outra dimensão… enfim…) , é preferível colocar essa validação onde? No setter dela…

Da mesma maneira, eu posso ter uma regra que me força á exibir um certo valor, caso o valor recuperado do banco venha em um formato inválido ou nulo, enfim…

Isso acontece muito com aplicações financeiras, muitos setters chamam rotinas para atualizar ou calcular/validar os valores sendo setados…

Sacou? Não sei se ficou bem claro… :roll:

Resumindo, não posso acessar meus atributos privados de dentro da própria classe sem ser via get e set pois seria má prática, mesmo estando dentro classe? Detalhe, qto. ao conceito de encapsulamento acredito que conheço, a questão é que seu criasse get e set de uma variável específica os mesmos ficariam sobrando… pois na minha óptica nunca seriam acessados externamente… só via a própria classe… daí q vem minha dúvida se mesmo assim preciso criar getter e setters…

Resumindo, você PODE. A idéia do encapsulamento é fazer com que o objeto possua estado sempre válido, i.e, peso não pode ser negativo, tempo não pode ser negativo, e por aí vai. Se, por algum motivo, você não possuir validação, não é errado acessar direto os atributos.

[]´s

Hmm… não entendi direito esse conceito, explique melhor isso… algo me diz que você está esquecendo que podemos instanciar as classes e acessar certas variáveis apenas pelos métodos getters/setters… confere?

Outra dúvida:

o “this.” só uso qdo. tem dois nomes q possa me levar a confundir… certo? ou seja, neste caso não usaria, né?

[quote=andredecotia]Outra dúvida:

o “this.” só uso qdo. tem dois nomes q possa me levar a confundir… certo? ou seja, neste caso não usaria, né?[/quote]

VocÊ nao usa this pq vai confundir alguma variavel, vc usa this para representar seu objeto corrente.

[quote=evertonsilvagomesjava][quote=andredecotia]Outra dúvida:

o “this.” só uso qdo. tem dois nomes q possa me levar a confundir… certo? ou seja, neste caso não usaria, né?[/quote]

VocÊ nao usa this pq vai confundir alguma variavel, vc usa this para representar seu objeto corrente.[/quote]

Exato, o this (traduzindo, “este”) representa o objeto atual, a classe atual… existe a variável this, e o método this()… pra ficar mais claro, fiz um exemplo dos dois casos:

[code]public class Teste {

int x = 10;

public Teste(){
	this(20); // chama o outro construtor, passando 20 como parametro
	int x = 30;
	System.out.println(this.x); // imprime 10, variavel de classe
	System.out.println(x); // imprime 30, variavel local
}

public Teste(int x){
	System.out.println(this.x); // imprime 10, variavel de classe
	System.out.println(x); // imprime 20, variavel recebida pelo parametro
}

public static void main(String[] args) {
	new Teste();
}

}[/code]