Repassar valores obtidos em uma classe para outra

3 respostas
javaprogramação
R

Pessoal boa tarde!
Estou com umas dificuldades em repassar os valores setados em uma classe para outras classes.
Se ainda ficou meio vago minha dúvida peço a gentileza de me alertar, rss.

Exemplo: Tenho uma classe que cadastra uma empresa e também tenho uma classe que seria para listar as empresas já cadastradas/armazenadas dentro de um Map.

EmpresasController.java

public class EmpresasController {
    private final EmpresasDAO empresasDAO;
    private final Empresas empresas;

    public EmpresasController() {
        this.empresasDAO = new EmpresasDAO();
        this.empresas = new Empresas();
    }

    public void CadastrarEmpresas(String id, String nome){
        this.empresas.setId(id);
        this.empresas.setNome(nome);
    }
}

EmpresasDAO.java

public class EmpresasDAO {

    private Map<String, String> map = new HashMap<>();

    public EmpresasDAO() {
        Empresas empresas = new Empresas();
        map.put(empresas.getId(), empresas.getNome());
    }

    public void ListarEmpresas(){
        for(String empresa : map.keySet()){
            System.out.println(map.get(empresa));
        }
    }
}

CadastroEmpresas.java

public class CadastroEmpresas {

    public CadastroEmpresas() {
        Messages messages = new Messages();
        messages.setInfo("\n[*] Cadastrar nova empresa\n");

        System.out.print("Digite o nome do empresa: ");
        Scanner scanner = new Scanner(System.in);

        Empresas empresas = new Empresas();
        empresas.setNome(scanner.next());

        EmpresasController empresasController = new EmpresasController();
        empresasController.CadastrarEmpresas(empresas.getId(), empresas.getNome());

        Access access = new Access();
    }
}

Empresas.java

public class Empresas {
    private UUID id;
    private String nome;

    public String getId() {
        this.id = UUID.randomUUID();
        return id.toString();
    }

    public void setId(String id) {
        this.id = UUID.fromString(getId());
    }

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

    public String getNome() {
        return nome;
    }
}

3 Respostas

H

Sugiro fazer algumas alterações.

Por exemplo, a classe Empresas (no plural) parece representar apenas uma empresa, então sugiro mudar o nome para Empresa (no singular).

E como parece que a intenção é que o id seja gerado automaticamente, então não faz sentido setá-lo. Eu sugiro que o construtor receba o nome e gere o id automaticamente. No seu código ainda tem outro problema: sempre que vc obtém o id, o getter gera outro, o que não parece fazer sentido.

Eu também removeria os setters. Uma vez criada a empresa, não faz sentido mudar o id. Talvez o nome faça sentido, depende do contexto: por exemplo, se mudar de nome, é considerada outra empresa? Se for, então melhor criar outra instância. Enfim, depende dos requisitos, mas eu deixaria assim:

public class Empresa {
    private UUID id;
    private String nome;
    public Empresa(String nome) {
        this.id = UUID.randomUUID();
        this.nome = nome;
    }

    public String getId() {
        return id.toString();
    }
    public String getNome() {
        return nome;
    }
    @Override
    public String toString() {
        return "Empresa{" + "id=" + id + ", nome=" + nome + '}';
    }
}

E no DAO eu faria o Map mapear instâncias de Empresa, caso contrário vc perderá essas instâncias (pois estava guardando apenas os nomes):

public class EmpresasDAO {
    private final Map<String, Empresa> map;
    public EmpresasDAO() {
        map = new HashMap<>();
    }

    void cadastrarEmpresa(String nome) {
        Empresa empresa = new Empresa(nome);
        map.put(empresa.getId(), empresa);
    }
    public void listarEmpresas() {
        for (String empresa : map.keySet()) {
            System.out.println(map.get(empresa));
        }
    }
}

Ou seja, o método de cadastro recebe o nome e internamente cria a Empresa (lembrando que o id é automaticamente criado no construtor). Depois eu adiciono a Empresa no map.

Vale lembrar que as convenções de código do Java dizem que métodos começam com letra minúscula, então ajustei os nomes também.


E no fim o controller só delega suas funções para o DAO:

public class EmpresasController {
    private final EmpresasDAO empresasDAO;
    public EmpresasController() {
        this.empresasDAO = new EmpresasDAO();
    }

    public void cadastrarEmpresa(String nome) {
        this.empresasDAO.cadastrarEmpresa(nome);
    }
    public void listarEmpresas() {
        this.empresasDAO.listarEmpresas();
    }
}

Não faz sentido o controller ter uma instância de Empresa. Ele apenas chama o DAO, passando os dados necessários, e o DAO se encarrega de criar a Empresa e gravá-la da forma que foi programada para fazer (e que o controller não precisa saber como é, ele só precisa saber como chamar o DAO para que este faça o que precisa).

Quanto à classe de cadastro, não sei se precisa. Pois no fim ela só repassa tudo para o controller, mas enfim, se quiser usá-la ficaria algo assim:

public class CadastroEmpresas {
    private final EmpresasController empresasController;
    public CadastroEmpresas() {
        empresasController = new EmpresasController();
    }
    public void cadastrarEmpresa() {
        System.out.print("Digite o nome do empresa: ");
        Scanner scanner = new Scanner(System.in);
        empresasController.cadastrarEmpresa(scanner.nextLine());
    }
    public void listarEmpresas() {
        this.empresasController.listarEmpresas();
    }

    // criei o main só pra testar
    public static void main(String[] args) {
        CadastroEmpresas cadastro = new CadastroEmpresas();
        // cadastrar 4 empresas
        for (int i = 0; i < 4; i++) {
            cadastro.cadastrarEmpresa();
        }
        cadastro.listarEmpresas();
    }
}

Ou seja, ele usa o controller, delegando para este as tarefas de cadastrar e listar as empresas. Claro que eu poderia usar o controller diretamente, sem precisar desta classe de cadastro, pois me parece desnecessária aqui. Enfim…

R

Muito obrigado pelo seu retorno, assim que possíveis irei validar suas dicas e volto aqui com mais detalhes.

R

Deu certo meu amigo, muito obrigado.
You rock man!

Criado 21 de outubro de 2024
Ultima resposta 22 de out. de 2024
Respostas 3
Participantes 2