Trilhas
/
Java
Java
/
Programa
/
Interfaces
In

Interfaces em Java

1 exercício

Sobre Interfaces

interfaces são o principal meio de desacoplar os usos de uma classe da sua implementação. Esse desacoplamento dá flexibilidade para a manutenção da implementação e ajuda a viabilizar comportamento genérico com segurança de tipos.

A sintaxe de uma interface é parecida com a de uma classe, exceto que os métodos aparecem apenas como assinatura, sem corpo.

public interface Language {
    String speak();
}

public interface ItalianLanguage extends Language {
    String speak();
    String speakItalian();
}

public interface ScriptConverter {
    void setVersion(String version);
    String getVersion();
    String convertCyrillicToLatin(String cyrillic);
}

A classe que implementa a interface precisa implementar todas as operações definidas por ela.

Normalmente, as interfaces fazem uma ou mais das seguintes coisas:

  • Permitir que o código que as usa trate várias classes diferentes de forma genérica. Nesse caso, as interfaces desempenham o mesmo papel que uma classe base. Um exemplo disso é java.io.InputStream,
  • Expor um subconjunto de funcionalidades para algum propósito específico (como Comparable<T>)
  • Expor a API pública de uma classe para que várias implementações possam coexistir. Um exemplo é o de um test double
public class ItalianTraveller implements ItalianLanguage {

    public String speak() {
        return "Ciao mondo";
    }

    public String speakItalian() {
        return speak();
    }
}

public class ItalianTravellerV2 implements ItalianLanguage {

    public String speak() {
        return "migliorata - Ciao mondo";
    }

    public String speakItalian() {
        return speak();
    }
}

public class FrenchTraveller implements Language {
    public String speak() {
        return "Ça va?";
    }
}

public class RussianTraveller implements Language, ScriptConverter {

    private String version;

    public void setVersion(String version) {
        this.version = version;
    }

    public String getVersion() {
        return version;
    }

    public String speak()
    {
        return "Привет мир";
    }

    public String convertCyrillicToLatin(String cyrillic) {
        throw new UnsupportedOperationException();
    }
}

public class DocumentTranslator implements ScriptConverter {

    private String version;

    public void setVersion(String version) {
        this.version = version;
    }

    public String getVersion() {
        return version;
    }

    public String translate(String russian) {
        throw new UnsupportedOperationException();
    }

    public String convertCyrillicToLatin(String cyrillic) {
        throw new UnsupportedOperationException();
    }
}

O código que usa as interfaces e classes acima pode:

  • Tratar todos os falantes da mesma forma, independentemente do idioma.
  • Permitir que algum subsistema que lida com conversão de escrita opere sem se preocupar com os tipos específicos com que está lidando.
  • Continuar sem saber das mudanças no falante de italiano, o que é conveniente se o código da classe e o código do usuário forem mantidos por equipes diferentes.

As interfaces são amplamente usadas para dar suporte a testes, pois permitem mocking fácil.

As interfaces podem estender outras interfaces com a palavra-chave extend.

Os membros de uma interface são públicos por padrão.

As interfaces podem conter tipos aninhados: interfaces, enums e classes. Aqui, as interfaces que os contêm atuam como namespaces. Os tipos aninhados são acessados fora da interface prefixando o nome da interface e usando a sintaxe de ponto para identificar o membro.

Por concepção, o Java não dá suporte a herança múltipla, mas viabiliza uma espécie de herança múltipla por meio das interfaces.

Além disso, o conceito de que o polimorfismo pode ser implementado por meio de interfaces sustenta o mecanismo das interfaces.

Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Interfaces