Encapsulamento

Encapsulamento significa que os dados ou atributos de uma classe ( o seu estado) e os métodos que os tratam devem escondidos na classe negando o acesso direto a esses dados a partir do exterior da classe. A classe, nesta situação, comporta-se como uma cápsula escondendo o seu interior, daí a designação “encapsulamento”. O acesso aos atributos da classe passa a fazer-se de forma controlada e não direta.

Benefícios do encapsulamento

  • Ocultação de dados: ao restringir o acesso ao estado interno do objeto, o encapsulamento protege os dados do objeto de modificações não intencionais ou prejudiciais.
  • Acesso controlado: o encapsulamento fornece acesso controlado aos dados usando métodos getter e setter, que podem incluir validação ou outra lógica.
  • Maior manutenibilidade: alterações na implementação interna podem ser feitas sem afetar o código externo que usa a classe.
  • Maior flexibilidade: o encapsulamento permite que alterações sejam feitas no funcionamento interno de uma classe sem afetar a interface externa.
  • Modularidade: o encapsulamento leva a uma melhor modularidade e separação de preocupações, tornando o código mais fácil de entender e manter.

Implementação do encapsulamento em Java

Para garantirmos o encapsulamento de uma classe temos de fazer o seguinte:

  • Declarar os campos como privados: tornar os dados (campos) privados para restringir o acesso direto de fora da classe.
  • Forneça métodos getter e setter públicos: use métodos públicos para fornecer acesso controlado aos campos privados. Esses métodos são chamados getters (para recuperar o valor) e setters (para modificar o valor).

Exemplo:

public class Empregado { 
   private String nome; //campo privado

   //getter e setter públicos
   public String getNome(){ 
      return this.nome; 
   }    
   public void setNome(String nome){ 
      this.nome = nome; 
   } 
} 

Getters e Setters

Um getter é um método público que retorna o valor de um campo. O seu nome é formado
pela palavra get mais o nome da propriedade em maiúscula. O seu tipo de dados é o tipo de
dados do campo.

Um setter é um método público que permite modificar o valor de um campo. O seu nome é
formado pela palavra set mais o nome do campo em maiúscula. É um método void que tem
um parâmetro do mesmo tipo de dados do campo.

Exemplo:

public class Aluno {
    // Campos privados
    private String nome;
    private int idade;

    // Construtor
    public Aluno(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }

    // Getter publico para 'nome'
    public String getNome() {
        return nome;
    }

    // Setter publico para 'nome'
    public void setNome(String nome) {
        this.nome = nome;
    }

    // Getter publico para 'idade'
    public int getIdade() {
        return idade;
    }

    // Setter publico para 'idade' com validação
    public void setIdade(int idade) {
        if (idade > 0) { // Validação para garantir que a idade é positiva
            this.idade = idade;
        } else {
            System.out.println("Digite uma idade válida");
        }
    }

    public void displayInfo() {
        System.out.println("Nome: " + nome + ", Idade: " + idade);
    }
}

Podemos ter campos em que só é permitida a consulta dos seus dados e não a sua alteração. Neste caso esses campos teriam um getter mas não um setter. Podemos igualmente ter campos só com setter.