Criar um único HashMap que contém uma "lista" de funcionários visível para o Main e para a classe Funcionario

Bom dia galera, beleza?
Quero criar uma classe “CadastrarFuncionario” que vai possuir um HashMap onde fica armazenado todos os Funcionários .A Key é o login, o Value é o objeto Funcionario.
Gostaria de poder acessar essa classe CadastrarFuncionario tanto do main, quanto do objeto Funcionario, pois assim sempre que eu cadastrar o funcionário pela classe Funcionario, eu vou adicionar no HashMap. Sempre que eu modificar um funcionário, modifico o HashMap. Ou seja, eu modifico o mesmo HashMap no Funcionario, e consulto o mesmo HashMap através do meu main.
É possível criar isso?

Por enquanto, meu código está assim:

public class CadastroFuncionario {   // Classe que armazenará o HashMap de funcionários

   private HashMap<String, Funcionario> funcionarios;

   public CadastroFuncionario() {
      funcionarios = new HashMap<>();
   }

   public void inserirFuncionario(Funcionario f) {
      funcionarios.put(f.getLogin(), f);    // Eu tenho o getLogin, apesar de não mostrar abaixo na classe Funcionario
   }
}

public class Funcionario {
   private final String login;
   private String senha;
   private String nome;

   public Funcionario(String login, String senha, String nome) {
      this.login = login;
      this.senha = senha;
      this.nome = nome;
      // Imagino que aqui eu chamaria a função inserirFuncionario
   }
}

Além do que eu já disse, em cada SET eu mandaria dar uma atualizada no HashMap cujo KEY seja o login deste funcionário (esta função eu criaria lá no CadastrarFuncionario pedindo como parâmetro o Login e o atributo mudado, certo?)

Agradeço desde já \o. Desculpem pela explicação ruim, especifiquei o melhor que pude
OBS: Não sei se estou no caminho certo. Gostaria de conseguir fazer isso deixando, a princípio, tudo em memória mesmo. Depois que ver que deu certo, vou tentar inserir arquivo. Também pretendo expandir isso para outras classes (Produto, Cliente etc.)

@Edit 04/10/2017 12:15
Sobre os SETSs: Acabei de perceber que talvez eu nem precise passar como parâmetro o atributo mudado, apenas coloco o novo Value como o objeto Funcionario já alterado

A primeira coisa é deixar essa variável estática, assim:

static private HashMap<String, Funcionario> funcionarios;
2 curtidas

Parece ter funcionado. Inclusive, acabei deixando tudo como static, pois assim posso usar os métodos sem instanciar a classe. O único detalhe é que precisei criar um método para criar o new HashMap (não sei se é necessário, mas fiz por garantia).
Inclusive, eu acabei nem precisando mexer nos Setters, por exemplo. Ao mudar o objeto, ele já mudava no HashMap. Obrigado pela ajuda!

Este é o pulo do gato que vc precisa! Pelo o que entendi, vc quer simulando um banco de dados. E para este comportamento, a resposta do @wldomiciano te atenderá perfeitamente.

Sim, pois por padrão, todo atributo que atende o padrão IS-A Object tem como valor padrão o null.
Você tb poderia instanciar um novo HashMap pelo construtor ou por um bloco de inicialização. Tb daria certo.

Velho conceito de acesso por referência! Se vc busca um objeto do HashMap e faz a alteração do mesmo, esta alteração será replicada em todos os pontos de referência do objeto resgatado.

2 curtidas

Outra sugestão seria jogar fora a classe CadastroFuncionario e deixar a a própria classe Funcionario se manter.
Isso acaba com a necessidade de deixar tudo estático, veja:

public class Funcionario {

    private static final Map<String, Funcionario> CADASTRO = new HashMap<>();

    /**
     * Método utilizado para pesquisar um funcionário através do login informado
     */
    public static Funcionario pesquisar(String login) {
        return CADASTRO.get(login)
    }

    private final String login;
    private String senha;
    private String nome;

    public Funcionario(String login, String senha, String nome) {
        this.login = login;
        this.senha = senha;
        this.nome = nome;
    }

    /**
     * Método utilizado para salvar este Funcionario
     */
    public void salvar() {
        CADASTRO.put(login, this);
    }
}
1 curtida