Oi Gabriel, tudo bem?
Quando temos atributos privados e criamos getters e setters a eles, sim, estamos fazendo o mesmo que deixá-los públicos. Afinal, todo mundo terá acesso e poderá alterar seu valor.
O que devemos evitar é de criá-los, já que eles vazam detalhes sobre a implementação da nossa classe além de obrigar clientes a conhecer detalhes sobre as regras de negócio.
Um exemplo clássico que usamos na Caelum:
class Conta {
private double saldo;
public void setSaldo(double saldo) {
...
}
public double getSaldo() {
...
}
}
Como faríamos um depósito de R$ 100,00 a partir dessa classe conta? Precisamos somar 100 ao saldo atual da conta, certo?
Conta conta = new Conta();
double saldoAtual = conta.getSaldo();
conta.setSaldo(saldoAtual + 100);
O cliente deve saber que, para realizar um depósito, ele deve somar 100 ao saldo antigo. Esse é um detalhe que a conta (e somente ela) deveria saber, certo? Sinal de que quebramos o encapsulamento vazando isso aos clientes.
Podemos deixar nosso modelo rico, dando-lhe um método deposita:
class Conta {
private double saldo;
public void deposita(double quantia) {
this.saldo += quantia;
}
}
Como realizar um depósito agora?
Conta conta = new Conta();
conta.deposita(100);
Outro exemplo (Android):
Queremos pegar um nome em um ListView
de nomes, como fazer?
String nome =
(String) listaDeNomes.getAdapter().getItem(posicao);
Repare que nesse caso, precisamos saber que temos que acessar um Adapter para ter acesso ao item.
Como diz a Lei de Demeter devemos evitar esse encadeamento de métodos get
, já que isso também expõe detalhes de implementação.
Na própria API do Android, temos uma alternativa:
String nome =
(String) listaDeNomes.getItemAtPosition(posicao);
Beleza?
Evite criar métodos get/set para todos os atributos, apesar de estamos mal acostumados. O objetivo da OO é tenta mapear o mundo real no nosso código, portanto crie comportamentos reais para seus objetos.
Afinal, você não fala pro seu gerente setar o saldo da sua conta, não é mesmo? (:
Espero que tenha ficado claro, qualquer dúvida pode perguntar!
Abraços!