Considerando o cenário montado durante o curso:
A classe BalancoEmpresa recebe um instância de ArmazenadorDados via construtor afim de desacoplar a classe BalancoEmpresa de qualquer implementação específica de ArmazenadorDados.
public class BalancoEmpresa {
private ArmazenadorDados dividas;
public BalancoEmpresa(ArmazenadorDados dividas){
this.dividas = dividas;
}
//restante do código
}
public interface ArmazenadorDados{
//métodos abstratos da interface
}
A classe MinhaAplicacao (ou qualquer outra classe cliente de BalancoEmpresa) fica então responsável por criar uma instância de ArmazenadorDados quando precisar de uma instância de BalancoEmpresa.
public class MinhaAplicacao{
public static void main(String [] args){
ArmazenadorDados ad = //instancia ArmazenadorDados de alguma maneira
//Aqui a dependencia é resolvida e injetada...
BalancoEmpresa balanco = new BalancoEmpresa(ad);
}
}
Expondo dessa maneira os detalhes de implementação da classe BalancoEmpresa (tornando público o fato de que ela utiliza de um ArmazenadorDados para realizar suas tarefas) não estamos quebrando o encapsulamento ????
Em caso positivo, como escolher entre manter o encapsulamento ou ganhar flexibilidade de comportamento usando a injeção de dependências???