Os modificadores de acesso controlam de onde uma classe, um atributo ou um método pode ser usado. Eles são a ferramenta principal do encapsulamento, um dos pilares da Orientação a Objetos.
Os quatro níveis
| Modificador | Mesma classe | Mesmo pacote | Subclasse (outro pacote) | Qualquer lugar |
|---|---|---|---|---|
public | ✔ | ✔ | ✔ | ✔ |
protected | ✔ | ✔ | ✔ | — |
| (sem modificador) | ✔ | ✔ | — | — |
private | ✔ | — | — | — |
Quando você não escreve nada, o acesso é o default (também chamado package-private): visível só dentro do mesmo pacote.
Na prática: encapsulamento
Veja uma conta bancária com o saldo público:
public class Conta {
public double saldo;
}
conta.saldo = -5000; // nada impede!Tornando o atributo private, a única forma de mexer no saldo passa a ser pelos métodos — que aplicam as regras:
public class Conta {
private double saldo;
public void depositar(double valor) {
if (valor <= 0) throw new IllegalArgumentException("Valor inválido");
saldo += valor;
}
public void sacar(double valor) {
if (valor > saldo) throw new IllegalStateException("Saldo insuficiente");
saldo -= valor;
}
public double getSaldo() { return saldo; }
}Quando usar protected
Use protected quando uma subclasse precisa reaproveitar ou especializar um comportamento da classe mãe, mas esse comportamento não deve ficar aberto a todo mundo:
public abstract class Relatorio {
public final String gerar() {
return cabecalho() + corpo();
}
protected String cabecalho() { return "Manual da Programação\n"; }
protected abstract String corpo();
}Regra de ouro
- Comece sempre pelo mais restrito (
private) e só abra quando houver motivo. - Atributos quase sempre
private; exponha comportamento, não dados. - Nem todo atributo precisa de getter e setter. Um
setSaldopúblico jogaria fora todo o encapsulamento acima.