Qual a real utilidade das interfaces?

Pessoal estive me perguntando:

Qual é a vantagem de usar interfaces, se no fim temos que reescrever todos os métodos? Não seria a mesma coisa se escrevêssemos os métodos direto nas classes, sem ter que implementar?

Qual a opnião de vc’s? Alguém teria um exemplo onde a interface é indispensáevel?

Valeu… té +

æ feliperod…

Não é nenhum pouco necessário utilizar algum interface num sistema…
Mas eu defendo as interfaces até em baixo d’água. huauhauha

Inerface na realidade serve pra vc padronizar objetos/classes, acredito que fica muito mais organizado e bem melhor documentado se vc utilizar interfaces… Mas como eu disse não é preciso se vc “achar”… :slight_smile:

Abraço,
maicon

tem também o lance da herança multipla, pois java não trabalha com herança muiltipla, então como fazer quando precisar?
Use a interface! na verdade vejo muitos arquitetos dizerem para usar a herança só em ultimo caso, sempre utilizar interface.

Mas na verdade interface não funciona como herança multipla. Quando se implementa uma interface, a classe onde foi implementada não “herda” nenhum tipo de atributo ou método. No fim das contas tem que ser tudo reescrito novamente, e ainda tem que acrescentar código.

implements interface

Mas, como o maicon_b falou, a única vantage talvez seja pra organizar o código, pq como substituto de Herança Múltipla não serve. Outra coisa legal é ao usar uma interface, o compilador não permite que vc deixe algum método dela sem implementar, e isso de certa forma ajuda a evitar “esquecimentos”.
Dizem tb que as interfaces servem pra ligar algumas super-classes, mas eu gostaria de saber que tipo de ligação existem nesse caso.

E a composição? não seria melhor saída para o caso da Herança Múltipla?[/code]

não disse que funciona como herança multipla, disse que quando você precisa deste artificio no java, a solução é usar interface.
E claro nos outros aspectos que o maicon já disse.

È isso mesmo… como foi dito acima, creio que é bom para desenvolver o programa mais organisadamente, principalmente se tem uma equipe trabalhando e todos vão mecher no código

Bem, eu vejo as interfaces com uma espécie de biblioteca de código, que reaproveita uma solução já pronta para uma determinada situação.

Por exemplo:

O que seria de nós sem os Listener’s da vida?
Será que lembrariámos sempre de todos os métodos?

Estou aqui para defender as interfaces, mas deixar bem claro que elas não fazem nenhuma mágica da mesma forma que se usássemos:

class SubClasse extends Pai1, Pai2{ }

diogoacl

e com isso perder horas reescrevendo métodos que podiam simplesmente serem herdados, né?
aonde vai parar a reutilização de codigo?
eu quero é passar longe desses arquitetos :slight_smile:

1 curtida

As interfaces servem para definir padrões de comportamento e diferente formas de acesso a ela. Ao implementar uma interface voce assume um comportamento e pode ser acessado por ele.

Bem, se eu não me engano, interfaces podem ser marcadoras, como a interface Serializable.
Se estiver falando bobagem, por favor, corrijam. :wink:

Na verdade, um dos principais fundamentos da interface é o tratamento de polimorfismo de classes.

Imagine o seguinte: você cria um programa de e-mails, que le e-mails no formato de texto, entao voce implementa as classes, com todos os metodos suficientes para a manipulacao de textos.

E se voce quiser agora que seu programa receba e-mails com audio?
Voce teria que implementar toda uma classe parecida com a de texto, so que com manipulacao de audio, e tambem tera que modificar toda o seu programa principal para ter condicoes (se for de texto leia como texto, se for de audio toque o audio)…

Usando interfaces, por exemplo interface EMail, voce pode criar duas classes implementando-a: EMailTexto e EMailAudio, com todos os metodos parecidos. No seu programa principal, você ira apenas utilizar a interface Email para ler os emails, e a linguagem Java ira saber automaticamente se a mensagem é de EmailTexto ou EMailAudio, sem precisar voce ficar tratando cada tipo diferente.

A grande maioria das classes da API de Java possuem interfaces, voce pode ler um List, mas este List pode ser um Vector, um LinkedList, um ArrayList, e voce nao precisar tratar cada um deles em especial no seu programa.

Só existe dois problemas em interface:
1- nao se pode construir objetos usando a interface, deve-se usar uma das classes que a implementa, ex.: List lista = new Vector();
2- Se uma classe implementa uma interface, apenas os metodos de assinatura da interface podem ser chamados, ex.: List lista = new LinkedList();
apenas metodos de List podem ser chamados, metodos como addFirst, removeFirst, addLast e removeLast nao podem ser chamados, pois nao existem na interface List.

Espero que tenha ajudado a mudar a sua opiniao em relacao a importancia de interfaces, e se eu estiver errado em algo que eu tenha explicao, por favor me avisem!

[quote=“feliperod”]Pessoal estive me perguntando:

Qual é a vantagem de usar interfaces, se no fim temos que reescrever todos os métodos? Não seria a mesma coisa se escrevêssemos os métodos direto nas classes, sem ter que implementar?

Qual a opnião de vc’s? Alguém teria um exemplo onde a interface é indispensáevel?

Valeu… té +[/quote]

Felipe, eu estou tendecioso a acreditar que, na resposta de sua pergunta, reside a alma do Java, e quiçá uma compreensão melhor das motivações da orientação a objetos. Eu também estou nessa busca, e quem já trilhou esse caminho deixou boas pistas, felizmente. (veja link abaixo)

Esse exemplo aqui eu achei esclarecedor:

[quote]interface Falante {

void falar();

}

abstract class Animal implements Falante {

abstract public void falar();

}

class Cachorro extends Animal {

public void falar() {
    System.out.println("Au!");
}

}

class Gato extends Animal {

 public void falar() {
    System.out.println("Miau.");
}

}

class Interrogador {

static void fazFalar(Falante sujeito) {
    sujeito.falar();
}

}[/quote]

Se estamos lidando com objetos, a forma com que esse objetos se comunicam é vital. Separar interface de implementação dá mais flexibilidade.

Ao final do artigo citado no link acima, o autor faz considerações preciosas acerca desse assunto, mas recomendo a leitura do artigo todo. É esclarecedor.

Exatamente!

Nesta parte:

class Interrogador {

static void fazFalar(Falante sujeito) {
sujeito.falar();
}
}

se não houvesse interfaces, precisariamos tratar cada tipo para a situação, ai ficarima mais complicado, tipo:

static void fazFalar(Object sujeito) {
if(sujeito instanceof Cachorro) {
Cachorro c = (Cachorro)sujeito;
c.falar();
}
else if(sujeito instanceof Gato) {
Gato g = (Gato)sujeito;
g.falar();
}
else {
System.out.println(“O sujeito nao eh nem cao nem gato”);
}
}

Imagina agora se um cliente decidice fazer um programa que tivesse um zoológico com cerca de uns 150 animais, cada um com uma classe…

Ia ser apenas 150 comandos “if-else”…
Com interface podemos criar 150 classes de Animais diferentes e numa classe principal tratá-los como se fosse um tipo apenas.

Realmente é uma das propriedades mais fundamentais em Java…