O que é Encapsulamento?
O encapsulamento é o pilar da POO que protege os atributos de uma classe, evitando acesso direto a eles. Consiste em esconder as implementações internas de uma classe e expor apenas o necessário através de interfaces bem definidas (métodos públicos).
Encapsulamento significa "esconder os detalhes de implementação e expor apenas o necessário".
Exemplo Prático
Vamos ver como implementar o encapsulamento em uma classe ContaBancaria:
public class ContaBancaria {
// Atributos privados (encapsulados)
private String titular;
private double saldo;
private String numeroConta;
private String senha;
// Construtor
public ContaBancaria(String titular, String numeroConta, String senha) {
this.titular = titular;
this.numeroConta = numeroConta;
this.senha = senha;
this.saldo = 0.0;
}
// Métodos públicos (interface)
public String getTitular() {
return titular;
}
public void setTitular(String titular) {
this.titular = titular;
}
public String getNumeroConta() {
return numeroConta;
}
public double getSaldo() {
return saldo;
}
// Nota: não existe setSaldo() - o saldo só pode ser alterado pelos métodos
// sacar() e depositar()
public boolean sacar(double valor, String senhaInformada) {
if (!senhaCorreta(senhaInformada)) {
return false;
}
if (valor > 0 && valor <= saldo) {
saldo -= valor;
return true;
}
return false;
}
public boolean depositar(double valor) {
if (valor > 0) {
saldo += valor;
return true;
}
return false;
}
// Método privado (implementação interna)
private boolean senhaCorreta(String senhaInformada) {
return this.senha.equals(senhaInformada);
}
}
Neste exemplo:
- Os atributos são
private, protegendo-os do acesso externo direto - Fornecemos getters para acesso controlado (getTitular, getSaldo)
- Alguns atributos não podem ser alterados diretamente (como saldo)
- As operações de modificação (sacar, depositar) incluem validações
- A implementação interna (método senhaCorreta) está oculta
Níveis de Acesso em Java
| Modificador | Mesma Classe | Mesmo Pacote | Subclasse | Qualquer Lugar |
|---|---|---|---|---|
private |
✅ | ❌ | ❌ | ❌ |
default (sem modificador) |
✅ | ✅ | ❌ | ❌ |
protected |
✅ | ✅ | ✅ | ❌ |
public |
✅ | ✅ | ✅ | ✅ |
Padrões de Encapsulamento
JavaBeans
Um padrão comum para encapsulamento em Java:
- Atributos privados
- Métodos públicos getters e setters
- Nome dos métodos seguem o padrão get/set + Nome do atributo
- Construtor sem argumentos
Objetos Imutáveis
Outra forma de encapsulamento onde, após criado, o objeto não pode ser modificado:
public final class Pessoa {
private final String nome;
private final String cpf;
public Pessoa(String nome, String cpf) {
this.nome = nome;
this.cpf = cpf;
}
public String getNome() {
return nome;
}
public String getCpf() {
return cpf;
}
// Não existem setters
}
Benefícios do Encapsulamento
- Segurança dos dados: Protege contra modificações indevidas
- Validação de dados: Permite validar valores antes de atribuí-los
- Flexibilidade de implementação: Permite alterar a implementação interna sem afetar o código cliente
- Manutenção simplificada: Facilita localizar erros e fazer alterações
- Oculta complexidade: Esconde detalhes complexos de quem usa a classe
Conclusão
O encapsulamento é um dos princípios mais importantes da POO, pois promove a segurança e a robustez do código. Ao encapsular dados e comportamentos, garantimos que os objetos mantenham seu estado interno consistente, facilitando o desenvolvimento, manutenção e evolução do sistema.
Na prática, sempre devemos buscar encapsular nossos atributos usando modificadores de acesso adequados e expondo apenas o que é necessário através de métodos bem definidos.