Percursos
/
Java
Java
/
Programa
/
Interfaces
In

Interfaces em Java

1 exercício

Sobre Interfaces

interfaces são o principal meio de desacoplar a utilização de uma classe da sua implementação. Este desacoplamento dá flexibilidade à manutenção da implementação e ajuda a suportar comportamento genérico com segurança de tipos.

A sintaxe de uma interface é semelhante à de uma classe, com a diferença de que os métodos aparecem apenas como assinatura e não é fornecido qualquer 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 tem de 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 utiliza trate várias classes diferentes de forma genérica. Neste caso, as interfaces desempenham o mesmo papel que uma classe base. Um exemplo disto é java.io.InputStream,
  • Expor um subconjunto de funcionalidades para um fim específico (como Comparable<T>)
  • Expor a API pública de uma classe para que possam coexistir várias implementações. 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 utiliza as interfaces e as classes acima pode:

  • Tratar todos os falantes da mesma forma, independentemente da língua.
  • Permitir que um subsistema que trate da conversão de escrita funcione sem se preocupar com os tipos concretos com que está a lidar.
  • Manter-se alheio às alterações ao falante italiano, o que é conveniente se o código da classe e o código de quem a utiliza forem mantidos por equipas diferentes.

As interfaces são amplamente utilizadas para apoiar os testes, pois permitem um mocking fácil.

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

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

As interfaces podem conter tipos aninhados: interfaces, enums e classes. Aqui, as interfaces que os contêm funcionam como namespaces. Os tipos aninhados são acessíveis fora da interface ao prefixar o nome da interface e usar a sintaxe de ponto para identificar o membro.

Por conceção, o Java não suporta herança múltipla, mas facilita um tipo de herança múltipla através das interfaces.

Além disso, o conceito de que o polimorfismo pode ser implementado através de interfaces está na base do mecanismo das interfaces.

Editar via GitHub A ligação abre numa nova janela ou separador

Aprende Interfaces