Quando criar Interfaces?

Eu já vi milhões de vezes aqui falando sobre uso e abuso de Inferfaces… mas acredito que como todo programador que aprendeu sozinho, tenho algumas deficiências de definição, conceito…

Alguém pode me dar um exemplo básico de quando eu usaria uma Interface?? Porque usar?? Pra que afinal de contas ela serve??

Valeu!! Desculpa a pergunta ridícula… :stuck_out_tongue:

Por exemplo…
Você quer fazer uma mini-framework para utilizar MVC na sua aplicação, criando um controller que vai servir para tratar vários servlets. Aí você cria uma interface para seus servlets que é o que o controller vai utilizar para chamar os métodos, mas as características específicas de cada servlet vai depender da implementação de cada classe.
Ou algo ainda mais simples:
Você precisa criar uma classe que contenha os métodos utilizados para acessar o banco de dados, mas você pode querer mudar de banco de dados futuramente e o próximo não se sabe se vai aceitar a mesma implementação dos métodos. Aí você cria uma interface e usa ela nas outras classes, e se mudar de banco de dados basta fazer uma classe nova que implemente a mesma interface.

Basicamente, interfaces ajudam seu código a tornar-se mais reusável, minimizando o trabalho quando é necessário mudar alguma coisa.
Além disso, muitas vezes servem para encapsular a implementação, como no caso da várias interfaces de banco de dados, por exemplo a ResultSet, que você usa toda hora sem nem precisar saber que classe está realmente sendo utilizada.

Ver a Bani respondendo sobre interfaces eh a mesma coisa que ver o Bill Gates respondendo sobre Linux :mrgreen:

Bom, para exemplificar o que ela quis dizer,

interface Command
{
	public void execute();
}

class ClasseUm implements Command
{
	public void execute()
	{
		System.out.println("ClasseUm");
	}
}

class ClasseDois implements Command
{
	public void execute()
	{
		System.out.println("ClasseDois");
	}
}

Note que temos 2 classes que implementam a interface Command. No caso, a
interface é útil para dizer é esperado que as classes que lhe implementarem tal
interface definam o corpo do método ( ou métodos ).
Entao é possível fazer um codigo mais generico e independente, como foi dito no
exemplo de Servlets. Entao poderiamos fazer

...
Command c = new ClasseUm();
c.execute();
c = new ClasseDois();
c.execute();
...

O resultado será “ClasseUm” e logo abaixo “ClasseDois”. Isso funciona porque
ambas classes implementaram a interface.

Mas ai voce poderia perguntar: e por que nao fazer uma classe abstrata? bem,
voce pode fazer sim, porem lembre-se que em Java voce somente pode extender uma
unica classe por vez, entao nao da para sair criando classes para tudo.
Muita coisa vai do ponto de analise do projeto, isso interfere muito na decisao
de usar interfaces.

Um bom candidato a interface eh quando voce notar que varias classes definem um mesmo metodo em comum, porem com implementacoes diferentes em cada uma ( por exemplo, voce tem uma fabrica de carros, onde voce monta diferentes tipos de carros, mas ha varias coisas em comum, como o metodo andar(), freiar() etc… ).

Apesar de voce poder fazer tudo sem interfaces ( e mesmo sem classes abstratas ), o correto em termos de design da aplicacao seria ter uma interface com os metodos andar() e freiar(), e entao implementar o metodo em cada tipo de “Carro”. Dessa maneira, fica tudo mais logico, simples e portavel na aplicacao.

Rafael

Pra entender Interfaces, vc precisa ter bem claros os conceitos de POO, cujo grande objetivo é reutilização de código.

Apenas reforçando as ótimas explicações da Bani e do Rafael:

Vc definiu um novo objeto chamado carro e quer que várias outras pessoas tbm fabriquem carros, porém vc não quer expor o seu projeto. Mas se vc não definir O QUE DEVE TER um carro para ser chamado de “carro”, cada pessoa vai fazê-lo do seu jeito. Uns vão fazer com asas, outros uma bicicleta com motor, etc. Pra resolver isso, vc cria uma INTERFACE, que diz quais partes DEVEM ser implementadas NO SEU PROJETO. Por exemplo, carro tem que ter freio, tem que acelerar, tem que desligar, tem que virar, etc. Como cada um vai fazer pra conseguir que o seu carro tenha esses métodos, propriedades e dados é problema de cada um. Se eu quiser fazer um carro movido a óleo de mixirica, tudo bem. Desde que ele acelere, que é uma exigência da Interface carro. Por isso que Interface não tem implementação, é apenas uma lista de “exigências” a serem implementadas.

Dessa forma vc consegue que o objeto carro seja padronizado e vc poderá reusá-lo em qualquer outro código que precise, pois vc sempre sabe o que esperar dele (métodos, propriedades, etc.), pois ele tem definida um Interface.

Assim, se você criar um objeto Ferrarri que implementa a Interface carro, eu vou poder usá-lo tranquilamente, pois sei pra que ele serve e o que ele faz (acelera, freia, vira, etc.).

Espero ter sido claro. :wink:

[]'s

leandro, soh tem louco no GUJ, nao liga nao.

a resposta para a sua pergunta: sempre.

VALEU!!!

Valeu Bani, mesmo que eu não tenha entendido nada do que você falou… :smiley:
Valeu Rafael, ESSE é o cara… sabia que se ele respondesse eu sairia com a resposta…
Valeu Rob, ficou ainda mais claro e agora já sei melhor QUANDO usar…
E Paulo, to em casa… :smiley: não conheci nenhum programador em Java com sua sanidade em dia até hj… heheheh

Bom… é questão de tempo até eu ir me acostumando com a idéia de interfaces, mas creio que um dia posso dizer que uso SEMPRE… hehehe

Agora… (lá vem eu denovo) aproveitando a ÓTIMA vontade de vocês… só pra esclarecer, uma classe Abstrata é uma classe que tem todos os métodos Static??? :?:

não,
uma classe abstrata é uma classe que tem alguns metodos não implementados, esta implementação fica a cargo de seus descendentes
por exemplo

public abstract class Parent {
  public abstract void iniciaSequencia();
  public abstract void finalizaSequencia();
  public void executaTrabalho(){
     iniciaSequencia();
     finalizaSequencia();
  }
}

para que voce faria isto??
você pode implementar estes dois metodos em cada filho desta classe de uma maneira diferente, e sempre que você chamar executaTrabalho ele vai utilizar a mesma logica :slight_smile:

é mais ou menos o seguinte, você tem a lógica da opeação definida, mas pode ter mais de uma implementação para ela

espero não ter confundido muito as coisas :slight_smile:

Tipow… tentei uma porrada de coisa pra usar essa classe que você postou com alguma classe filha dela mas não consegui… :stuck_out_tongue:

urubatan

NAO! Uma classe abstrata pode ter ZERO (NENHUM) ou TODOS metodos implementados. Seu uso varia de design p/ design.

é verdade,
ela pode ter todos os metodos implementados, mas ai não vejo grande vantagem em declara-la abstract
mas como você disse, é uma decisão de design, acho que a unica vantagem, seria não permitir que a classe fosse instanciada :slight_smile:

e respondendo a mensagem anterior :slight_smile:

public abstract class Parent {
  public abstract void iniciaSequencia();
  public abstract void finalizaSequencia();
  public void executaTrabalho(){
     iniciaSequencia();
     finalizaSequencia();
  }
} 

public class Child extends Parent {
  public void iniciaSequencia(){
     System.out.printLn("Inicio");
  }
  public void finalizaSequencia(){
     System.out.printLn("Fim");
  }

  public static void main(String[] args){
    new Child().executaTrabalho();
  }
}

não é a classe mais util do mundo, mas é um exemplo :slight_smile: