Oi!
No código que cê mandou, a classe Compra
esconde o valor
com o truque de deixar ele como private
. Então, só os métodos dentro da própria classe Compra
conseguem chegar direto nesse atributo. Mas, a interface Comparable
exige um método chamado compareTo
que compara dois objetos da mesma classe.
Bora dar uma olhada na versão atual do compareTo()
na classe Compra
:
@Override
public int compareTo(Compra outraCompra) {
return Double.valueOf(this.valor).compareTo(Double.valueOf(outraCompra.valor));
}
Essa parada compara os valores double
dos objetos Compra
. A razão pela qual não precisamos usar o getValor()
nesse caso é por causa da visibilidade dos membros dentro da mesma classe.
Dentro da classe Compra
, mesmo que o valor
seja top secret (private
), outros métodos da mesma classe ainda podem chegar nele direto. O compareTo()
tá dentro da classe Compra
, então pode acessar o valor
na boa, sem precisar chamar o getValor()
.
Pra clarear isso, dá uma olhada nesse exemplo:
public class Compra implements Comparable<Compra> {
// ... outros membros
public void algumMetodo() {
double valorDaCompra = this.valor; // Acesso direto ao atributo privado
// ... resto do código
}
}
E olha esse outro código:
public class AlgumaOutraClasse {
public void algumOutroMetodo() {
Compra compra = new Compra();
// O código abaixo ia dar erro na compilação, porque 'valor' é privado
// double valorDaCompra = compra.valor;
}
}
Entender essa diferença entre acesso interno e externo à classe é chave pra sacar por que o compareTo()
pode ir direto no valor
.
Mas, vale lembrar que, às vezes, é melhor usar métodos de acesso (getters
) mesmo dentro da mesma classe. Isso ajuda a manter o código na mesma vibe e facilita mudanças futuras na classe, garantindo que todas as operações passem pelos métodos certos.
A versão abaixo do compareTo()
usando getValor()
é igual à que você sugeriu:
@Override
public int compareTo(Compra outraCompra) {
return Double.valueOf(this.getValor()).compareTo(Double.valueOf(outraCompra.getValor()));
}
Essa abordagem é mais clara e pode ser melhor em alguns casos, principalmente quando tem lógica a mais no getValor()
. Mas, no exemplo que você deu, acessar o valor
direto na mesma classe tá de boa.