Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Ausência de getValor() no compareTo()

public class Compra implements Comparable<Compra> {
    private String descricao;
    private double valor;
    
    public double getValor() {
        return valor;
    }

    @Override
    public int compareTo(Compra outraCompra) {
        return Double.valueOf(this.valor).compareTo(Double.valueOf(outraCompra.valor));
    }

No método compareTo() da classe Compra, conseguimos acessar diretamente o atributo "valor" do objeto "outraCompra". Como isso é possível, visto que estamos acessando diretamente um atributo private de outro objeto? Eu havia entendido que um atributo private só pode ser acessado pelo seu próprio objeto e seus respectivos métodos.

Porque não é necessário usar o método getValor() nesse caso? [Exemplo tentanto fazer uma analogia com a aula 04.02. Ordenando a lista:]

    @Override
    public int compareTo(Compra outraCompra) {
        return Double.valueOf(this.getValor()).compareTo(Double.valueOf(outraCompra.getValor()));
    }
1 resposta
solução!

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.