11.5 Estrutura de Classes e Objetos em Java: Encapsulamento
Em Java, o conceito de encapsulamento é um dos pilares fundamentais da programação orientada a objetos. Encapsulamento é a técnica de ocultar os detalhes de implementação de uma classe e expor apenas as funcionalidades necessárias para o mundo exterior. Isso é feito usando o controle de acesso aos membros de uma classe, que são principalmente variáveis e métodos. O encapsulamento ajuda a proteger os dados e a manter a integridade do objeto, além de tornar o código mais fácil de manter e evoluir.
O encapsulamento em Java é alcançado através de modificadores de acesso, que controlam a visibilidade das variáveis e métodos de uma classe. Os quatro modificadores de acesso em Java são:
- private: O membro só pode ser acessado dentro da própria classe.
- default (sem modificador): O membro pode ser acessado dentro do mesmo pacote.
- protected: O membro pode ser acessado dentro do mesmo pacote ou por subclasses em pacotes diferentes.
- public: O membro pode ser acessado de qualquer lugar.
Para entender melhor o encapsulamento, vamos considerar um exemplo de uma classe que representa um banco. Suponha que temos uma classe chamada ContaBancaria
que possui um saldo como variável de instância.
public class ContaBancaria {
private double saldo;
public ContaBancaria(double saldoInicial) {
if (saldoInicial > 0) {
this.saldo = saldoInicial;
}
}
public void depositar(double valor) {
if (valor > 0) {
saldo += valor;
}
}
public boolean sacar(double valor) {
if (valor > 0 && saldo >= valor) {
saldo -= valor;
return true;
}
return false;
}
public double getSaldo() {
return saldo;
}
}
Neste exemplo, a variável saldo
é marcada como private
, o que significa que ela não pode ser acessada diretamente de fora da classe ContaBancaria
. Em vez disso, métodos públicos como depositar()
, sacar()
e getSaldo()
são fornecidos para permitir que operações sejam realizadas no saldo de maneira controlada.
O método depositar()
permite adicionar dinheiro ao saldo, mas apenas se o valor for positivo. O método sacar()
permite retirar dinheiro, mas também verifica se o valor é positivo e se há saldo suficiente. O método getSaldo()
é um "getter" que permite a outras classes obterem o saldo atual, mas sem a possibilidade de modificá-lo diretamente.
Além disso, o construtor da classe ContaBancaria
também impõe uma regra de que o saldo inicial deve ser maior que zero. Isso é parte do encapsulamento, pois garante que a conta bancária comece em um estado válido.
Encapsulamento também permite que a implementação interna de uma classe seja alterada sem afetar as classes que a utilizam. Por exemplo, se decidirmos mudar a forma como o saldo é armazenado ou calculado internamente na classe ContaBancaria
, não precisaríamos modificar o código de outras classes que dependem dela, desde que os métodos públicos permaneçam os mesmos.
Outro aspecto importante do encapsulamento é que ele permite a criação de "setters", métodos que permitem modificar o valor de uma variável de instância de maneira controlada. Por exemplo, se quisermos permitir a alteração do saldo, poderíamos adicionar um método setSaldo()
que incluiria validações antes de realmente alterar o valor.
Em resumo, o encapsulamento é uma prática essencial na programação orientada a objetos. Ele protege os dados de um objeto, mantém a integridade do objeto, facilita a manutenção e evolução do código e promove a reutilização do código. Ao projetar suas classes em Java, sempre aplique o encapsulamento para garantir um design de software robusto e confiável.
Para finalizar, é importante lembrar que o encapsulamento não é apenas sobre ocultar dados ou torná-los privados. Trata-se de definir uma interface clara e consistente para suas classes, o que torna seus objetos mais fáceis de entender e usar corretamente. O encapsulamento ajuda a prevenir o uso inadequado de uma classe e garante que as regras de negócio sejam aplicadas, tornando o software mais confiável e fácil de manter.