1
resposta

Orientado à interfaces e especificações , orientado à implementação.

Qual é a diferença entre programar orientado à interfaces e especificações e orientado à implementação?

1 resposta

Boa noite, Leandro! Como vai?

Excelente pergunta!

Basicamente, a diferença é que programando orientado à interfaces e especificações vc terá flexibilidade para trocar de uma implementação para outra caso seja necessário!

Por outro lado, se vc programar voltado especificamente à uma implementação, vc poderá ter problemas se precisar trocar de implementação utilizada dado que as implementações sempre tem liberdade de adicionar recursos adicionais não estipulados pelas especificações!

Exemplo prático 1:

Hibernate e EclipseLink são duas implementações da especificação JPA! Embora ambas sigam as regras definidas pela JPA, ainda assim elas podem criar funcionalidades específicas de cada uma delas.

Exemplo prático 2:

Suponha que vc tenha uma classe Banco que gerencie uma lista do tipo Conta! Algo como

class Banco {
     private ArrayList<Conta> contas = new ArrayList<>();  // I

     public void adiciona(Conta c) {
          this.contas.add(c);
     }

     public ArrayList<Conta> getContas() {  // II
          return this.contas;
     }
}

e ao utilizar essa classe nós teríamos

class TesteBanco {
     public static void main(String[] args) {
          Banco banco = new Banco();

          // Adicionar algumas contas.

          ArrayList<Conta> contas = banco.getContas();  // III
     }
}

Perceba que se agora um dia for preciso mudar a implementação de ArrayList<E> para LinkedList<E> teremos que fazer modificações dentro da classe Banco ( nas linhas I e II ) e inclusive fora da classe Banco ( na linha III )!

Isso poderia facilmente ser evitado se nosso código tivesse sido desenvolvido orientado à interface List<E> como no código abaixo!

class Banco {
     private List<Conta> contas = new LinkedList<>();  // I

     public void adiciona(Conta c) {
          this.contas.add(c);
     }

     public List<Conta> getContas() {
          return this.contas;
     }
}

class TesteBanco {
     public static void main(String[] args) {
          Banco banco = new Banco();

          // Adicionar algumas contas.

          List<Conta> contas = banco.getContas();
     }
}

Observe que com esse novo código, sempre que for preciso mudar o tipo de lista, precisaremos alterar apenas a linha I dentro da classe Banco!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!