Exercício 6 capítulo 16.15 apostila Caelum

Bom dia, estou com o seguinte problema estou fazendo esse exercício, mas na hora de usar o metodo buscaPorNome sempre me retorna null, não sei dizer se eu que não entendi exatamente como fazer a busca, mas segui o que o exercício orienta.

6(opcional) No Banco, crie um método Conta buscaPorNome(String nome) que procura por uma Conta
cujo nome seja equals ao nome dado.
Você pode implementar essemétodo comum for na sua lista de Conta, porém não tem uma performance
eciente.
Adicionando um atributo privado do tipo Map<String, Conta> terá um impacto signicativo. Toda vez
que ométodo adiciona(Conta c) for invocado, você deve invocar .put(c.getNome(), c) no seumapa.
Dessa maneira, quando alguém invocar o método Conta buscaPorNome(String nome), basta você fazer
o get no seu mapa, passando nome como argumento!
Note, apenas, que isso é só um exercício! Dessa forma você não poderá ter dois clientes com o mesmo
nome nesse banco, o que sabemos que não é legal.
Como caria sua classe Banco com esse Map?

Classe TesteBanco.

import java.util.LinkedList;

public class TestaBanco {

public static void main(String[] args) {
    Banco banco = new Banco();

    banco.setConta(new LinkedList<Conta>());

    Conta c = new ContaCorrente();

    banco.adiciona(c);
    c.setNome("João");
    c.deposita(1500);

    Conta c1 = new ContaCorrente();

    banco.adiciona(c1);
    c1.setNome("João");
    c1.deposita(2800);
    
    System.out.println(banco.buscaPorNome("João"));

Classe Banco.

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Banco {

private List<Conta> conta;
private int numDeContas;
private Map<String, Conta> mapaDeContas = new HashMap<String, Conta>();

public void adiciona(Conta c) {
    conta.add(c);
    mapaDeContas.put(c.getNome(), c);
    numDeContas++;
}

public Conta pegaConta(int x) {
    return conta.get(x);
}

public List<Conta> getConta() {
    return conta;
}

public void setConta(List<Conta> conta) {
    this.conta = conta;
}

public int pegaTotalContas() {
    return this.numDeContas;
}

public Conta buscaPorNome(String nome) {
    return mapaDeContas.get(nome);
}

}

Talvez o Conta.getNome ou Conta.setNome não estejam funcionando corretamente. Aparentemente está tudo certo.

Segue minha classe Conta.

public abstract class Conta {
protected double saldo;
protected int numero;
protected String nome;



/**
 * Metodo que verifica se o valor a ser depositado é valido
 * 
 * @param valor
 */
public void deposita(double valor) {
    if (valor < 0) {
        throw new ValorInvalidoException(valor);
    } else {
        this.saldo += valor;
    }
}

/**
 * Método que verifica se existe saldo para realizar o saque
 * 
 * @param valor
 */
public void saca(double valor) {
    if (this.saldo < valor) {
        throw new ValorInvalidoException(valor);
    } else {
        this.saldo -= valor;
    }
}

public double getSaldo() {
    return saldo;
}

public void atualiza(double taxa) {
    this.saldo = this.saldo * taxa;
}

public String toString() {
    return "este objeto é uma conta com saldo R$ " + this.saldo;
}

public int getNumero() {
    return numero;
}

public void setNumero(int numero) {
    this.numero = numero;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}
}

Eu acho que achei o erro, no método adiciona eu mandava já colocar o .put(c.getNome,c), mas na classe de teste eu colocava o c.setNome só depois de adicionar, invertendo a ordem, se eu tentar colocar as duas contas com o mesmo nome e tentar imprimir as duas, para as duas impressões,mostra o valor da ultima conta adicionada seria este o modo correto para o buscaPorNome?

Boa tarde, o erro está nesta parte amigo:
banco.adiciona(c); c.setNome("João"); c.deposita(1500);

O que aconteceu foi que você primeiro adicionou o objeto “c” a sua lista “banco” e então depois você definiu o nome da conta e fez a operação deposita, ou seja, você adicionou um objeto de certa forma vazio na lista e então depois você definiu o nome etc. Desta forma o objeto em si que está na classe TestaBanco ficou com as definições de nome e o que você adicionou ficou vazio, você deve definir o nome e o valor antes de adicionar a lista, assim seria o método correto:

c.setNome("João"); c.deposita(1500); banco.adiciona(c);

Obrigada pela ajuda, era isso mesmo