1
resposta

"Apagar" um objeto na construção, tem como?

No exemplo do bytebank, estou tentando fazer com que, se ao tentar criar uma conta ou cliente e essa conta ou cliente já existe, então não se deixar criar a conta ou cliente (por meio de Exceptions). Eu consegui fazer com que a mensagem "conta já existe" ou "cliente já existe" fosse mostrada. Porém o objeto já tinha sido criado, ou seja, quem usa o método main poderia ainda usar o cliente/conta normalmente. Construtor de conta:

// Atributos
private double saldo;
private int agencia;
private int numero;
private Cliente titular;

private static ArrayList<Conta> listaContas = new ArrayList<Conta>();
private static int totalContas;

// Construtor
public Conta(int agencia, int numero, Cliente titular) {
    try {        
        this.agencia = agencia;
        this.numero = numero;
        if (Conta.listaContas.contains(this)) {
            // this = null; // ???
            throw new AlreadyExistsException("Conta já existe!");
        } else {
            this.titular = titular;
            Conta.listaContas.add(this);
            Conta.totalContas++;
        }
    } catch(AlreadyExistsException ex) {
        System.out.println(ex.getMessage());
    }
}

Eu sobreescrevi o método .equals() para que duas contas sejam iguais quando número e agência são iguais, assim:

@Override
public boolean equals(Object obj) {
    Conta outra = (Conta) obj;

    if (this.agencia != outra.agencia) {
        return false;
    }

    if (this.numero != outra.numero) {
        return false;
    }

    return true;
}

Eu tentei "apagar" o objeto com 'this = null', mas o compilador não deixa. Talvez eu pudesse não tratar o erro na construção, mas sim toda vez que fosse criar uma conta ou cliente, porém eu não sei se isso é muito elegante. Tem alguma forma eficiente de fazer o que eu quero?

1 resposta

Fala, Hélio! Tudo bem contigo?

Desculpe a demora em dar um retorno!

Eu tenho um mini projeto onde eu aplico justamento o que está precisando e acredito que vai te ajudar a desenvolver o seu!!!

Eu tenho uma Classe onde cadastro autores e essa Classe possui nome e email

public class Autor {

    private String nome;
    private String email;

/// codigo omitido

Dentro dela eu também coloque um equals onde um novo Autor não será cadastrado caso exista outro Autor com o mesmo e-mail

/// codigo omitido

    @Override
    public boolean equals(Object obj) {
        Autor outroAutor = (Autor) obj;
        return this.email.equals(outroAutor.email);
    }

Feito isso, criei uma outra Classe para "simular" meu banco de dados e dentro dela uma Lista estática para guardar os autores criados

public class AdminAutores {

    private static List<Autor> listaDeAutores = new ArrayList<>();

/// codigo omitido

Obs: trabalhar com listas será no curso de Collections ;-)

Agora, vem a lógica para inserir meus autores conferindo com meu equals

Fiz uma condicional onde eu confirmo se na lista "contém" o Autor que estou criando e caso positivo, lance uma exception, caso contrário, adicione esse Autor na minha lista de autores.

/// código omitido

    public void insereAutor(Autor autor) {
        if(AdminAutores.listaDeAutores.contains(autor)) {
            throw new RuntimeException("Já existe um AUTOR cadastrado em nosso sistema com esse EMAIL");
        }
        AdminAutores.listaDeAutores.add(autor);
    }

Para testar, Hélio, criei uma Classe de testes, inseri meus autores e esses autores através do método na lista. Posso até colocar um System.out.printlnpara ver esse erro acontecer, caso eu insira um Autor com o mesmo nome


public class TesteEdigi {

    public static void main(String[] args) {

        AdminAutores listaDeAutores = new AdminAutores();

        Autor cassio = new Autor("Cassio", "cassio.java@primeiroautor.com.br");
        Autor murilo = new Autor("Murilo", "cassio.java@primeiroautor.com.br");

        listaDeAutores.insereAutor(cassio);
        listaDeAutores.insereAutor(murilo);

/// código omitido

Espero ter contribuído, Hélio!

No curso de Java Collections você verá listas com muito mais detalhes!

Um abraço e bons estudos