Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Não entedi como ficaria o ProcessadorDeInvestimentos

Como ficaria a chamada da lista na classe ProcessadorDeInvestimentos, pois antes eu imagina que o código era:

public class ProcessadorDeInvestimentos {

    public static void main(String[] args) {
    List<ContaComum> contasDoBanco = Arrays.asList(new ContaComum(), new ContaComum(), new ContaEstudante);
        for (ContaComum conta : contasDoBanco()) {
            conta.rende();

            System.out.println("Novo Saldo:");
            System.out.println(conta.getSaldo());
        }
    }
}

Como esse código fica agora?

2 respostas

Bom dia Diego,

Creio que o ProcessadorDeInvestimentos pode ficar assim:

public class ProcessadorDeInvestimentos {

    public static void main(String[] args) {

        for (ContaComum conta : contasDoBanco()) {
            conta.rende();

            System.out.println("Novo Saldo:");
            System.out.println(conta.getSaldo());
        }
    }

    private static List<ContaComum> contasDoBanco() {
        return Arrays.asList(umaContaCom(100), umaContaCom(150), contaDeEstudanteCom(200));
    }

    private static ContaComum contaDeEstudanteCom(double amount) {
        ContaDeEstudante c = new ContaDeEstudante();
        c.deposita(amount);
        return c;
    }

    private static ContaComum umaContaCom(double valor) {
        ContaComum c = new ContaComum();
        c.deposita(valor);
        return c;
    }
}

Diz aí o que achou da sugestão.

Abraço.

solução!

Minha dúvida era no cenário onde ContaEstudante não herdasse ContaComun, ou seja, o método contaDeEstudanteCom não poderia retornar um ContaComun, isto pq a ContaEstudante é uma conta não rentável, logo não teria o método "rende()", logo a chamada dentro do loop também daria erro no caso de uma ContaEstudante. Isto pq não podemos render uma conta de estudante, então não faz sentido ela estar no processador de investimentos. Já a conta comum é uma conta rentável, logo criei uma interface do tipo "ContaComRendimento" que tem o método render e no for apenas contas com rendimento poderiam ser processadas. Em fim, fiz algo usando implementação interfaces e composição.

public class ProcessadorDeInvestimentos {

    public static void main(String[] args) {
        // imprimi o rendimentos das contas rentáveis
        contasComunsDoBanco().forEach(conta -> {
            conta.render();
            System.out.printf("Saldo: %,.2f\n", conta.getSaldo());
        });

        // imprimi as milhas das contas não rentáveis
        contasEstudantesDoBanco().forEach(conta -> {
            System.out.printf("Saldo: %,.2f - Milhas: %d\n", conta.getSaldo(), conta.getMilhas());
        });

        // para imprimir algo que se aplica a todas as conta do banco
        // rentáveis ou não podemos usar o "contasDoBanco()"
        double saldoTotalDoBanco = contasDoBanco().stream().mapToDouble(Conta::getSaldo).sum();
        System.out.println("Saldo Total do Banco é: " + saldoTotalDoBanco);

    }

    private static List<ContaNaoRentavel> contasEstudantesDoBanco() {
        return Arrays.asList(new ContaEstudante(100), new ContaEstudante(), new ContaEstudante(50));
    }

    private static List<ContaRentavel> contasComunsDoBanco() {
        return Arrays.asList(new ContaComum(100), new ContaComum(), new ContaComum(50));
    }

    private static List<Conta> contasDoBanco() {
        List<Conta> contas = new ArrayList<Conta>();
        contas.addAll(contasComunsDoBanco());
        contas.addAll(contasEstudantesDoBanco());
        return contas;
    }
}