Implementando encapsulamento

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

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. Atributos Privados: nome e idade são privados, então não podem ser acessados diretamente fora da classe Pessoa.
  2. Getters e Setters: Métodos públicos que permitem acessar e modificar os atributos privados.
  3. Validação: No método setIdade, há uma verificação para garantir que a idade seja positiva antes de definir o atributo idade.

Dessa forma, o encapsulamento garante que os dados internos de uma classe sejam protegidos e manipulados de maneira controlada e previsível.