12.6 Encapsulamento e Métodos Acessores (Getters e Setters)
O encapsulamento é um dos quatro pilares fundamentais da programação orientada a objetos (POO), juntamente com a herança, a polimorfismo e a abstração. Encapsulamento é a prática de manter os campos (variáveis de instância) de uma classe privados e fornecer acesso a eles através de métodos públicos. Isso é feito para manter o controle sobre os valores que estão sendo definidos e obtidos, e para proteger a integridade dos dados mantidos pela classe.
Os métodos acessores, conhecidos como getters e setters, são a forma padrão de implementar encapsulamento em Java. Eles são métodos públicos que servem para obter (get) e definir (set) o valor de campos privados de uma classe.
Convenções de Nomenclatura para Getters e Setters
Em Java, há uma convenção de nomenclatura bem estabelecida para getters e setters que ajuda a manter o código legível, consistente e acessível para outras ferramentas e frameworks que dependem dessas convenções.
Para um campo chamado nome
, por exemplo, o getter seria nomeado getNome()
e o setter seria nomeado setNome()
. Essa convenção se aplica a todos os campos, com algumas regras específicas para campos booleanos, onde o getter muitas vezes começa com is
em vez de get
, como isAtivo()
para um campo chamado ativo
.
Aqui estão as regras gerais para nomear getters e setters:
- Getters: O método começa com a palavra
get
seguida pelo nome do campo com a primeira letra maiúscula. Se o campo for do tipo boolean, você também pode usaris
em vez deget
. - Setters: O método começa com a palavra
set
seguida pelo nome do campo com a primeira letra maiúscula.
Esses métodos devem ser marcados como públicos para que possam ser acessados de fora da classe. Além disso, o método setter geralmente retorna void
e aceita um parâmetro do mesmo tipo do campo que está definindo, enquanto o getter retorna um valor do mesmo tipo do campo.
Exemplo de Implementação de Getters e Setters
public class Pessoa {
private String nome;
private int idade;
private boolean ativo;
// Getter para o campo nome
public String getNome() {
return nome;
}
// Setter para o campo nome
public void setNome(String nome) {
this.nome = nome;
}
// Getter para o campo idade
public int getIdade() {
return idade;
}
// Setter para o campo idade
public void setIdade(int idade) {
this.idade = idade;
}
// Getter para o campo ativo (note o uso de 'is' em vez de 'get')
public boolean isAtivo() {
return ativo;
}
// Setter para o campo ativo
public void setAtivo(boolean ativo) {
this.ativo = ativo;
}
}
Por Que Usar Getters e Setters?
Embora possa parecer mais simples acessar os campos diretamente, existem várias vantagens em usar getters e setters:
- Controle de Acesso: Você pode controlar se um campo é somente leitura ou somente gravação, ou se ele deve seguir certas regras de validação ao ser definido.
- Ocultação de Implementação: A classe pode mudar a forma como os dados são armazenados internamente sem afetar as classes que a utilizam.
- Flexibilidade: Você pode adicionar lógica adicional aos métodos acessores, como notificar outros objetos sobre mudanças no valor, realizar validações, ou até mesmo adiar o cálculo do valor até que ele seja realmente necessário (lazy loading).
- Compatibilidade com Frameworks: Muitos frameworks Java, como Spring e Hibernate, dependem de getters e setters para funcionar corretamente.
É importante notar que, embora os getters e setters sejam uma prática comum, eles não são obrigatórios. Em alguns casos, onde a classe é muito simples e não requer controle adicional sobre seus campos, pode ser aceitável expor os campos diretamente. No entanto, isso deve ser feito com cautela e entendendo as consequências para a manutenção e flexibilidade do código.
Em resumo, getters e setters são uma parte crucial do encapsulamento em Java. Eles fornecem uma interface controlada para acessar e modificar os campos de uma classe, mantendo a integridade e a flexibilidade do código. Seguir as convenções de nomenclatura para esses métodos é essencial para manter a consistência e garantir a interação adequada com outras partes do ecossistema Java.