2
respostas

Coloquei uma forma diferente no "compareTo" e deu certo, queria saber se é viável.

package Banco01;

public class Compra implements Comparable {

private String descricao;
private double valor;

public Compra(String descricao, Double valor) {
    this.descricao = descricao;
    this.valor = valor;
}

public String getDescricao() {
    return descricao;
}

public Double getValor() {
    return valor;
}

@Override
public String toString() {
    return "Compra: descrição = " + descricao + ", valor = " + valor;

}

@Override
public int compareTo(Compra outraCompra) {
    return this.getValor().compareTo(outraCompra.getValor());
}

}

package Banco01;

import java.util.ArrayList;
import java.util.List;

public class CartaoDeCredito {

private Double limite;
private Double saldo;
private List<Compra> compras;

public CartaoDeCredito(double limite) {
    this.limite = limite;
    this.saldo = limite;
    this.compras = new ArrayList<>();
}

public boolean compra(Compra compra) {
    if (this.saldo > compra.getValor()) {
        this.saldo -= compra.getValor();
        this.compras.add(compra);
        return true;
    } else {
        return false;
    }
}

public Double getLimite() {
    return limite;
}

public Double getSaldo() {
    return saldo;
}

public List<Compra> getCompras() {
    return compras;
}

}

package Banco01;

import java.util.Collections;
import java.util.Scanner;

public class Principal {

public static void main(String[] args) throws Exception {
    Scanner entrada = new Scanner(System.in);

    System.out.println("Quanto você possui de crédito");
    Double limite = entrada.nextDouble();
    entrada.nextLine();
    CartaoDeCredito cartaoDeCredito = new CartaoDeCredito(limite);

    int opcao;
    do {
        String menu = """

        Escolha uma opção
        ------------------------------------------
        1- Comprar um produto
        2- Vizualizar a lista de produtos
        3- Vizualizar crédito
        4- sair
        ------------------------------------------
        """;

        System.out.println(menu);
        opcao = entrada.nextInt();
        entrada.nextLine();

        switch (opcao) {
            case 1:
                System.out.println("O que você quer comprar? ");
                String produto = entrada.nextLine();

                System.out.println("Qual o valor? ");
                Double valor = entrada.nextDouble();
                entrada.nextLine();

                Compra compra = new Compra(produto, valor);
                boolean compraRealizada = cartaoDeCredito.compra(compra);

                if (compraRealizada) {
                    System.out.println("Compra realizada!");
                } else {
                    System.out.println("Saldo insuficiente para realizar a compra.");
                }
                break;
            case 2:
                Collections.sort(cartaoDeCredito.getCompras());
                for (Compra lista : cartaoDeCredito.getCompras()) {
                    System.out.println(lista);
                }
                break;
            case 3:
                System.out.printf("Você possui R$%.2f de crédito\n", cartaoDeCredito.getLimite());
                break;
            case 4:
                break;

            default:
                System.out.println("Você precisa digitar as opções 1, 2, 3 ou 4\n");

        }

    } while (opcao != 4);
}

}

2 respostas

Oi, Skollymowskyv! Como vai?

Gostei da forma como você implementou o compareTo usando o getValor().compareTo(...). Essa abordagem é viável, pois delega a comparação para a própria implementação do Double, tornando o código mais limpo e seguro contra erros de comparação manual.

Uma dica interessante para o futuro é que você também pode ordenar por outros critérios, como a descrição, usando Comparator.comparing, o que evita ter que alterar o compareTo da classe:


Collections.sort(cartaoDeCredito.getCompras(), Comparator.comparing(Compra::getDescricao));

Esse código ordena as compras pelo texto da descricao em ordem alfabética.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Sua implementação do método compareTo está correta e é totalmente viável.

A linha return this.getValor().compareTo(outraCompra.getValor()); é uma forma muito inteligente e limpa de fazer a comparação.

Por que essa abordagem é boa?
Ao invés de usar uma lógica manual como if/else para retornar -1, 0 ou 1, você está delegando a comparação para o método compareTo da própria classe Double. Como a classe Double já implementa Comparable, você pode simplesmente usar o seu método para comparar os valores.

Isso traz várias vantagens:

Legibilidade: O código fica mais curto e fácil de entender. É claro que você está comparando o valor da compra atual com o valor de outraCompra.

Reaproveitamento de código: Você evita reinventar a roda e usa uma funcionalidade já pronta e testada da linguagem.

Confiabilidade: A implementação de compareTo da classe Double já é otimizada e livre de bugs que poderiam acontecer em uma implementação manual.

Sua solução é um ótimo exemplo de como usar a herança de forma eficaz e seguir boas práticas. Você está no caminho certo para se tornar um programador que escreve código limpo e eficiente.