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.