[Resolvido]-Qual a vantagem de usar interface/implements?

Pessoal, qual a vantagem de criar uma interface no java, criamos interface e implementamos nas classes, fazendo o polimofismo… mas se eu nõo criar interface e criar o mesmo métodos nas classes, irão funcionar do mesmo jeito … então qual a diferença ?

Intefaces contém apenas assinaturas.
Classes abstratas podem conter apenas assinaturas (de métodos declarados como abstratos).

O uso de interfaces possibilita baixo acoplamento (não interessa a classe que está sendo usada, mas sim que ela cumpra o “contrato”, ou seja, implemente os métodos da interface). Como uma classe pode implementar inúmeras interfaces, ela pode atender a diversos contratos, enquanto que herança possibilita herdar / substituir comportamentos já implementados, e, se a classe for abstrata, pode ter, apenas assinaturas também (métodos abstratos).

Existem algumas nuâncias em quando usar herança e quando usar interfaces, eu diria que cabe o “bom senso”, mas, até se ganhar o “feeling” de quando usar uma coisa ou outra, o “feeling” pode levar à problemas de projeto.

Há uma tendência atual em se priorizar o uso de interfaces ao uso de herança, porém, a depender de como é feito, você pode ter um conjunto de coisas soltas cuja relação entre elas é difícil de perceber.

Na maioria dos casos, para um estado permanente (ex: uma pessoa física jamais será uma pessoa jurídia) eu usaria herança, por desejar forçar a amarração/uso do tipo tipo específico. Eu nunca uso interfaces para models. Já vi em alguns fóruns o uso de Interfaces para o mesmo caso (pessoa física / pessoa jurídica).

O uso da interface tem diversos benefícios, mas nesta sua dúvida o sistema pode ficar por exemplo mais escalável, fazendo um estudo de caso, pense em uma loja que aceita pagamento somente em dinheiro… depois de seis meses ela começa a aceitar pagamentos em débito e crédito. Neste caso você criaria uma interface Pagamento e declararia os seus métodos, assim, para todos os tipos de pagamentos você implementaria a interaface, gerando a idéia do polimorfismo, diferentes formas de pagamento mas, com o mesmo resultado final(dinheiro no bolso :lol: ) além de desacoplar a sua classe, porque, imagine, se você tivesse que ficar criando vários métodos dentro de uma classe, iria diminuir a coesão, além de diminuir o nível de reusabilidade e etc… etc… etc…

então… mas se eu criar a mesma assinatura do método em várias classes … vai ser a mesma coisa que usar interface ne nao… ? (eu digo que vai ser a msm coisa pq estou usando a mesma assinatura do método em várias classes . como se fosse a assinatura de uma interface.
isso é mais questão de organização ? usar interface e não sair criando métodos com o mesmo nome em várias classes?

Neste caso você esta pensando em apenas um único desenvolvedor,você. Imagine uma equipe, é mais fácil passar para o programador a interface que ele tem que implementar ao invés de ele ter que ficar criando os métodos e derrepente alterar os parametros do seu método, fazendo com que não exista a possibilidade de utilizar o polimorfismo. Eu acredito que mesmo você se ficar um tempinho sem pegar em um projeto o seu tempo de adaptação vai ser maior, com a interface, você apenas implementa ela e cumpri com o contrato…

2 curtidas

pronto! Resolveu a minha dúvida, vc deu um ótimo exemplo.
=)

Imagine essa situação. Qual das duas seria mais fácil de manter?

Sem Interface.

[code]class Radio {
public boolean ligar(){}
}

class Televisao {
public boolean ligar() {}
}

class GerenciadorEletronico {
public boolean testar(Object o) // Nao existe uma interface ou classe comum
if(o instanceof Radio) {
Radio r = (Radio) o;
return r.ligar();
}
if(o instanceof Televisao) {
Televisao t = (Televisao) o;
return t.ligar();
}
// Se tivessemos 20 classes com o metodo ligar seriam 20 ifs
return false;
}
}[/code]

Com interface.

[code]interface Eletronico {
boolean ligar(){}
}

class Radio implements Eletronico {
public boolean ligar(){}
}

class Televisao implements Eletronico {
public boolean ligar() {}
}

class GerenciadorEletronico {
public boolean testar(Eletronico e) { // Agora sim ta mais simples
return e.ligar();
}
}[/code]

1 curtida