Encapsulamento

Eu não consigo entender na prática, a objetividade do Encapsulamento. Entendo que é uma padrão a ser seguido e tal, mas se eu não declarar as minhas variáveis de instâncias como private, não daria no mesmo? O código abaixo está funcionando. Eu o compreendi perfeitamente, mas veja que eu declarei a minha variável de instância nome como pública e as demais private. No main eu consigo normalmente chamar o cachorro. nome, já na idade, sou obrigado a setar na minha classe Animal e invocar o método setIdade no main. Beleza! Sendo que não entendo o motivo de ser assim, qual a praticidade disso? Talvez em projetos maiores, eu consiga entender.

 public class Animal {

 	public String nome;
 	private String especie;
 	private int idade;
 	
 	
 /*	public String getNome() {
 		return nome;
 	}
 	
 	public void setNome(String nome) {
 		this.nome = nome;
 	}
 	
 	public String especie() {
 		return especie;
 	}
 	
 	public void setEspecie(String especie) {
 		this.especie = especie;
 	}
 */	
 	public int getIdade() {
 		return idade;
 	}
 	
 	public void setIdade(int idade) {
 		this.idade = idade;
 	}
 /*
 	public void emitirBarulho() {
 		System.out.print("Barulho do animal");
 	}

 	public boolean ehMaior() {
 		return idade >= 1;
 	}
 */
 	
 }

Aqui o método principal:

 public class Programa {
 	public static void main(String[] args) {
 		Animal cachorro = new Animal();
 		
 		cachorro.nome = "Carlos";
 		cachorro.setIdade(2);
 		
 		System.out.println("O meu animal se chama " + cachorro.nome + " e tem " + cachorro.getIdade() + " anos");		
 		
 	}
 }

Na apostila da Caelum em Encapsulamento:

class Cliente {
    private String nome;
    private String endereco;
    private String cpf;
    private int idade;

    public void mudaCPF(String cpf) {
       validaCPF(cpf);
       this.cpf = cpf;
    }
   
   private void validaCPF(String cpf) {
// série de regras aqui, falha caso nao seja válido
}
// ..
}

Agora, se alguém tentar criar um Cliente e não usar o mudaCPF para alterar um cpf diretamente, vai receber
um erro de compilação, já que o atributo CPF é privado. E o dia que você não precisar verificar o CPF de quem
tem mais de 60 anos? Seu método fica o seguinte:

public void mudaCPF(String cpf) {
   if (this.idade <= 60) {
   validaCPF(cpf);
   }
   this.cpf = cpf;
}

O controle sobre o CPF está centralizado: ninguém consegue acessá-lo sem passar por aí, a classe Cliente
é a única responsável pelos seus próprios atributos!

A ideia seria, ao meu ver, criar um sistema mais tolerante a falhas… se o desenvolvedor bota tudo public e visível a todas classes, erros podem se espalhar ao longo de todo o software.

Eu achava que encapsulamento era apenas getter e setter, você pode continuar pensando assim, sinta-se a vontade.

Vou te dizer o que é encapsulamento pra mim, ou seja, não é uma descrição técnica, nem acadêmica e posso estar errado, mas creio que estou certo.

A String é uma classe final, ou seja, que não pode ser estendida, logo, no sentido prático todos os seus métodos são finais.

Quando você faz, suaString.split(“x”), você não quer saber como a operação é feita, quer apenas o resultado.

Assim, o encapsulamento é bem mais abrangente do que fornecer getter e setter para variáveis, ou acesso a MÉTODOS privados.

Vejamos:
Quando você compra um computador, você não quer saber como ele foi montado nem de quantos átomos foi composto, você quer que ele funcione como o especificado.

Quer pensar encapsulado?
Quantos carros você viu hoje?
Me diga, consegue associar quantos carros viu com a cor dele?
Será que lembra de 1, 2, 0?

Será que sua mente não encapsulou sua visão, para que reconheça objetos do tipo carro, de acordo com sua forma, sem se importar com sua cor, ou proprietário?

Encapsular é basicamente não se importar em como a implementação é realizada, mas sim com o resultado desta implementação.

Esta é a minha visão sobre encapsulamento.
Divirta-se. :smile_cat:

Adendo:
O encapsulamento. além de praticidade, também provê segurança à aplicação, mas ai tem muito mais coisa envolvida do que somente a utilização de modificadores de acesso privado (essenciais como todos os outros).

2 curtidas