Repassar valores obtidos em uma classe para outra

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;
    }
}

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…

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

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