Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Violação de encapsulamento (private)?

A solução sugerida para a classe AlteraEmpresa contém uma alteração dos atributos da empresa, componente da classe Banco, diretamente pela classe AlteraEmpresa:

// código omitido Banco banco = new Banco(); Empresa empresa = banco.buscaEmpresaPelaId(id); empresa.setNome(nomeEmpresa); empresa.setDataAbertura(dataAbertura); return "redirect:entrada?acao=ListaEmpresas"; //código omitido

Pensei em uma alternativa que preservasse o encapsulamento da classe Banco, criando ali um método alteraEmpresa :

/código omitido

public void alteraEmpresa(Integer idEmpresa, String nomeEmpresa, Date dataEmpresa) { for (Empresa emp : empresas) { if(emp.getId() == idEmpresa) { emp.setNome(nomeEmpresa); emp.setDataDeAbertura(dataEmpresa); } } }

//código omitido

E na classe AlteraEmpresa:

//código omitido

    Banco banco = new Banco();
    banco.alteraEmpresa(idEmpresa, nomeEmpresa, dataEmpresa);        
    return "redirect:entrada?acao=ListaEmpresas";        

//código omitido

Mas a solução proposta funciona , apesar do atributo "List empresas" na classe Banco ser "private", além de "static". Como funciona isto?

1 resposta
solução!

Olá, Sergio. Gosto da sua solução para alterar a empresa, passando a responsabilidade para a classe Banco. Quanto à sua pergunta, o private , junto ao static, restringe o acesso ao atributo da classe, ou seja, você não pode fazer o código abaixo.

List<Empresa> lista = Banco.empresas;

Mas veja que a classe AlteraEmpresa não precisa de uma referência à lista de empresas. Quando o professor fez o método buscaPelaId, você não tem acesso direto à lista, mas sim a uma Empresa contida na Lista. A Empresa, por sua vez, contém métodos públicos que permitem a alteração do seu nome e data de abertura.