Tracce
/
Java
Java
/
Programma
/
Interfacce
In

Interfacce in Java

1 esercizio

Informazioni su Interfacce

Le interfaces sono il mezzo principale per disaccoppiare gli usi di una classe dalla sua implementazione. Questo disaccoppiamento offre flessibilità nella manutenzione dell'implementazione e aiuta a supportare un comportamento generico sicuro rispetto ai tipi.

La sintassi di un'interfaccia è simile a quella di una classe, con la differenza che i metodi compaiono solo come firma e non ne viene fornito il 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);
}

La classe che implementa l'interfaccia deve implementare tutte le operazioni che essa definisce.

Di solito le interfacce fanno una o più delle seguenti cose:

  • Consentono al codice che le usa di trattare genericamente classi diverse tra loro. In questo caso le interfacce svolgono lo stesso ruolo di una classe base. Un esempio è java.io.InputStream,
  • Espongono un sottoinsieme di funzionalità per uno scopo specifico (come Comparable<T>)
  • Espongono l'API pubblica di una classe, così che più implementazioni possano coesistere. Un esempio è il 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();
    }
}

Il codice che usa le interfacce e le classi qui sopra può:

  • Trattare tutti i parlanti allo stesso modo, indipendentemente dalla lingua.
  • Permettere a un sottosistema che gestisce la conversione di scrittura di funzionare senza preoccuparsi dei tipi specifici con cui ha a che fare.
  • Restare all'oscuro dei cambiamenti al parlante italiano, cosa comoda se il codice della classe e il codice utente sono mantenuti da team diversi.

Le interfacce sono ampiamente usate per supportare i test, perché permettono un facile mocking.

Le interfacce possono estendere altre interfacce con la parola chiave extend.

I membri di un'interfaccia sono pubblici per impostazione predefinita.

Le interfacce possono contenere tipi annidati: interfaces, enums e classes. Qui, le interfacce che li contengono fungono da namespaces. Dall'esterno dell'interfaccia, ai tipi annidati si accede anteponendo il nome dell'interfaccia e usando la sintassi con il punto per identificare il membro.

Per scelta progettuale, Java non supporta l'ereditarietà multipla, ma la facilita in una certa misura attraverso le interfacce.

Inoltre, l'idea che il polimorfismo si possa implementare tramite le interfacce è alla base del meccanismo delle interfacce.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Interfacce