Encapsulamento é um dos quatro pilares da Programação Orientada a Objetos (POO) em Java, juntamente com herança, polimorfismo e abstração. Ele é uma técnica usada para proteger os dados dentro de uma classe e controlar o acesso a esses dados.
Conceito de Encapsulamento
O encapsulamento envolve agrupar dados (atributos) e métodos (funções ou comportamentos) que operam nesses dados dentro de uma única unidade, ou classe, e restringir o acesso direto a alguns dos componentes da classe. Isso é feito através da utilização de modificadores de acesso (private, protected, public) e métodos especiais conhecidos como getters e setters.
Benefícios do Encapsulamento
- Proteção de Dados: Ao tornar os atributos privados, você impede que eles sejam acessados diretamente de fora da classe, evitando modificações indesejadas ou inconsistentes.
- Facilidade de Manutenção: Como os dados são acessados e modificados através de métodos específicos (getters e setters), qualquer mudança na implementação interna da classe não afeta diretamente o código que utiliza a classe.
- Controle sobre os Dados: Você pode adicionar lógica nos métodos setters para validar ou modificar os dados antes de realmente armazená-los. Por exemplo, verificar se uma idade fornecida é positiva antes de atribuí-la a um atributo de idade.
- Aumento da Flexibilidade: Você pode alterar a estrutura interna da classe sem afetar o funcionamento externo, desde que a interface pública (os métodos getters e setters) permaneça a mesma.
Implementação de Encapsulamento em Java
Aqui está um exemplo simples para ilustrar o conceito de encapsulamento em Java:
public class Pessoa {
// Atributos privados
private String nome;
private int idade;
// Construtor
public Pessoa(String nome, int idade) {
this.nome = nome;
setIdade(idade); // usando o setter para aplicar lógica de validação
}
// Getter para nome
public String getNome() {
return nome;
}
// Setter para nome
public void setNome(String nome) {
this.nome = nome;
}
// Getter para idade
public int getIdade() {
return idade;
}
// Setter para idade
public void setIdade(int idade) {
if (idade > 0) {
this.idade = idade;
} else {
System.out.println("Idade deve ser positiva.");
}
}
}
Uso da Classe Encapsulada
public class TesteEncapsulamento {
public static void main(String[] args) {
Pessoa pessoa = new Pessoa("João", 25);
System.out.println("Nome: " + pessoa.getNome());
System.out.println("Idade: " + pessoa.getIdade());
pessoa.setIdade(-5); // Tenta definir uma idade negativa
System.out.println("Idade após tentativa de setIdade(-5): " + pessoa.getIdade());
}
}
Explicação do Código
- Atributos Privados:
nomeeidadesão privados, então não podem ser acessados diretamente fora da classePessoa. - Getters e Setters: Métodos públicos que permitem acessar e modificar os atributos privados.
- Validação: No método
setIdade, há uma verificação para garantir que a idade seja positiva antes de definir o atributoidade.
Dessa forma, o encapsulamento garante que os dados internos de uma classe sejam protegidos e manipulados de maneira controlada e previsível.