Qual é a diferença entre programar orientado à interfaces e especificações e orientado à implementação?
Qual é a diferença entre programar orientado à interfaces e especificações e orientado à implementação?
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!