O encapsulamento é um dos pilares fundamentais da Programação Orientada a Objetos que consiste em:
- Ocultar os detalhes internos de implementação da classe
- Proteger os dados contra modificações inadequadas ou diretas
- Controlar o acesso aos atributos através de métodos específicos
- Manter a integridade dos dados da classe
Analogia: É como um carro - você não precisa saber como o motor funciona internamente, apenas usar os controles disponíveis (volante, pedais, alavancas) para interagir com ele.
public // Acessível de qualquer lugar do programa
private // Acessível apenas dentro da própria classe
protected // Acessível na mesma package e em subclasses
// (sem modificador) = package-private - acessível apenas no mesmo pacotepublic class MinhaClasse {
private String dadoSensivelSemprePrivado; // ✅ SEMPRE privado
// Métodos públicos para acesso controlado
public String getDado() {
return dadoSensivelSemprePrivado;
}
public void setDado(String valor) {
// Aqui podemos validar antes de atribuir
if (valor != null && !valor.isEmpty()) {
this.dadoSensivelSemprePrivado = valor;
}
}
}- Validação: Verificar se o valor é válido antes de atribuir
- Controle: Decidir quais atributos podem ser lidos/modificados
- Processamento: Transformar ou formatar dados
- Flexibilidade: Poder alterar implementação interna sem afetar código externo
private TipoDoAtributo nomeDoAtributo;
// Getter - para LEITURA (GET = pegar/obter)
public TipoDoAtributo getNomeDoAtributo() {
return nomeDoAtributo;
}
// Setter - para ESCRITA (SET = definir/alterar)
public void setNomeDoAtributo(TipoDoAtributo valor) {
// Validações podem ir aqui
this.nomeDoAtributo = valor;
}public class ContaBancaria {
private double saldo; // Protegido!
private String titular; // Protegido!
// Getter para saldo (permite consulta)
public double getSaldo() {
return saldo;
}
// Setter com validação (controle)
public void depositar(double valor) {
if (valor > 0) { // Validação
this.saldo += valor;
} else {
System.out.println("Valor deve ser positivo!");
}
}
// Método específico para saque (mais controle)
public boolean sacar(double valor) {
if (valor > 0 && valor <= saldo) {
this.saldo -= valor;
return true;
}
return false;
}
}- Impede alterações diretas e inadequadas
- Mantém a consistência dos dados
- Pode mudar implementação interna sem afetar código externo
- Facilita manutenção e evolução do código
- Garante que dados sempre estejam em estado válido
- Evita erros e comportamentos inesperados
- Facilita alterações e correções
- Reduz impacto de mudanças no sistema
public class Errado {
public String nome; // EVITE! Qualquer um pode alterar
public int idade; // EVITE! Sem validação
}public class Correto {
private String nome;
private int idade;
public void setIdade(int idade) {
if (idade >= 0 && idade <= 150) { // Validação
this.idade = idade;
}
}
public int getIdade() {
return idade;
}
}- Crie uma classe Produto com atributos privados (nome, preço, estoque)
- Implemente getters e setters com validações apropriadas
- Teste validações tentando atribuir valores inválidos
- Compare comportamento com e sem encapsulamento
← 01 - Classes e Objetos | 03 - Herança →
💡 Lembre-se: Encapsulamento é sobre controle e proteção. Sempre mantenha dados importantes privados e forneça acesso controlado através de métodos públicos!