Por que usar interface?

A interface usa métodos sem corpo e deixa a implementação pra classe que usar essa interface. Mas pra quê criar um arquivo com métodos sem corpo, se eu posso assinar e implementar métodos diretamente em uma classe concreta?

Também tive essa mesma dúvidas tempos atrás. As pessoas dizem que ajudam no código, no baixo acoplamento, na segurança, a escrever menos código, mas como escrever mais código (código que parece inutil até) poderia ajudar nessas coisas?

Vou tentar contribuir com um exemplo.

Interfaces representam contratos. Sempre que uma classe implementa uma interface, ela está assumindo a responsabilidade/obrigação de implementar todos os métodos declarados naquela interface. Considere o seguinte código:

ArrayList<Car> cars = new ArrayList<>();

Digamos que em algum ponto do desenvolvimento o time descubra que utilizar ArrayList está causando queda na performance e que usar uma LinkedList reduziria considerávelmente este problema. Imagine que ArrayList<Car>s estão espalhadas por toda a base de códigos, imagine a dificuldade pra alterar tudo e os possiveis erros!

No trecho acima, o código está dependente de uma implementação especifica, ele está altamente acoplado ao ArrayList e diante do problema proposto, a alteração poderia ser uma grande dor de cabeça. Ao trabalharmos com interfaces, poderiamos fazer assim:

List<Car> cars = new ArrayList<>();

Desta forma se precisarmos fazer a troca por um outro tipo, poderiamos seguramente fazer assim:

List<Car> cars = new LinkedList<>();

Isso acontece porque tanto ArrayList quanto LinkedList implementam a interface List, e isso quer dizer que as duas se comportam publicamente de maneira semelhante e embora realizem internamente/privadamente suas funções de forma diferente, o resultado e a API são as mesmas.

Digamos que mais pra frente o time decida criar sua própria versão de um array dinamico pra tentar melhorar ainda mais aquele problema de performance, ele poderia fazer assim:

class MyAmazingList<E> implements List<E> {
  /* ... */
}

E então:

List<Car> cars = new MyAmazingList<>();

Sem causar maiores problemas.

Bom, espero que tenha ficado um pouco mais claro pra vc, caso contrário, faz a pergunta novamente pra obter melhores respostas.

Um artigo que me ajudou bastante a entender foi esse:

É com PHP, mas os conceitos são os mesmos.

3 curtidas