Boa noite Thiago, tudo tranquilo?
Essa pergunta de quando utilizar um e outro no âmbito de acesso a variável assola muita gente por ai e a resposta mais correta e que sempre deixa o pessoal com mais dúvida ainda é: DEPENDE. Mas ai você pode perguntar, depende do que? Depende de quem pode acessar aquele método ou atributo. Vamos para um exemplo prático para elucidar um pouco as coisas.
package br.com.alura.test;
public class Conta {
private int numero;
private double saldo;
protected void saca(double valor) {
this.saldo = valor + this.saldo;
}
public void transfere(double valor, double taxa, Conta contaDestino)
{
if(this.saldo < valor + taxa) {
System.out.println("Saldo insuficiênte");
} else {
this.saldo = this.saldo - valor - taxa;
contaDestino.saldo = this.saldo + valor;
}
}
}
Perceba o seguinte, eu coloquei os atributos como private, ou seja, somente dentro da classe conta
você terá acesso a eles diretamente utilizando this.saldo
ou saldo
. Isso trará segurança ao seu código.
Com certeza você já deve ter ouvido falar sobre essa tal de segurança que o controle de acesso traz. A partir disto o que talvez você pergunte é: Segurança contra o que? A resposta está mais perto de você do que imagina. A segurança é contra você mesmo e contra programadores desavisados.
Por exemplo, temos o método transfere
que transfere o saldo de uma conta para outra e com isso é cobrado uma taxa. Imagina agora sua variável public double saldo
e um programador desavisado que quer fazer uma transferência e faz o seguinte:
contaOrigem.saldo = contaOrigem.saldo - valor
e
contaDestino.saldo = contaDestino.saldo + valor
Temos um problema, pois o programador não sabia que tinha que cobrar uma taxa por transferência e o controle de acesso não barrou ele, então o mesmo achou que estava fazendo certo em acessar direto a variável do objeto e sair modificando como ele entendesse. Isso também seria possível se a variável fosse protected double saldo
e um programador desavisado que está dentro do mesmo pacote realizasse essa operação ou até mesmo em uma subclasse.
Essa segurança fornecida pelo modificadores de controle de acesso são ótimos pois caso a variável saldo fosse private o programador desavisado seria então avisado por sua IDE ou pelo compilador que ele tentou fazer algo que não está certo. Mas é claro, você não pode declarar todo o seu código como private, você tem que ponderar o que deve ou não ser de acesso a outros locais. Com isso talvez o DEPENDE agora ficou mais claro.
Então a dica que eu posso lhe dar agora seja a seguinte: Comece com private, caso mais alguma classe precise do recurso suba um nível, vá para o protected (ele é um meio termo entre o public e o private). Ainda precisa de mais acesso?! Vá para public. Mas sempre tenha em mente antes de subir o controle de acesso o que um programador desavisado pode fazer com o recurso que você acabou de dar a ele.
Com grande acessos, vêm grandes responsabilidades.
Mais informações sobre controle de acesso: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html