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:
Comparable<T>)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ò:
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.