21 Interface

Die öffentlichen Methoden eines Objekts bilden die Schnittstelle, über die seine Umgebung mit ihm kommunizieren kann. Soll sichergestellt werden, dass Objekte verschiedener Klassen auf die gleiche Weise angesprochen werden können, müssen die entsprechenden Klassen jeweils die betreffenden öffentlichen Methoden implementieren.

Will die Umgebung eine dieser Methoden aufrufen, benötigt sie einen Verweis auf das entsprechende Objekt. Bei einem Verweis muss jedoch genau festgelegt sein, welchen Typ das Objekt besitzt, auf das verwiesen wird. Obwohl verschiedene Klassen über Methoden mit der gleichen Signatur und dem gleichen Rückgabetyp verfügen, muss die Umgebung deshalb für jede dieser Klassen einen eigenen Zugriffsweg implementieren.

Um dies zu vermeiden, können in Java sogenannte Interfaces (Schnittstellen) verwendet werden.

Ein Interface (Schnittstelle) ist ein Referenztyp ähnlich einer Klasse, der jedoch lediglich die Signatur und den Rückgabetyp von Methoden deklariert. Die Deklaration wird nach den runden Klammern durch einen Strichpunkt beendet. Ein Methodenrumpf, bestehend aus geschweiften Klammern und einer Implementierung, fehlt. Die Methoden sind immer öffentlich und abstrakt, so dass auf die explizite Angabe der Modifikatoren public und abstract verzichtet werden kann.

Merke: Interface

Implementiert eine Klasse ein Interface, sichert sie zu, dass sie alle in dem Interface vorgesehenen Methoden implementiert. Objekte dieser Klasse besitzen damit auch den Typ des implementierten Interfaces. Dies hat den Vorteil, dass ihre Objekte auch überall dort einsetzbar sind, wo ein Objekt mit dem Referenztyp des jeweils implemetierten Interfaces verlangt wird. Allerdings sind in diesem Fall nur die Methoden sichtbar, die das betreffende Interface vorschreibt.

Beispiel

Das Interface DataAccessStudent deklariert öffentliche, abstrakte Methoden, die für den Zugriff auf gespeicherte Schülerdaten erforderlich sind.

JAVA
public interface DataAccessStudent {

    ArrayList<Student> readStudents();

    void saveStudent(Student pStudent);

    // ...

}
Abb. 21-1: Interface DataAccessStudent (Quellcode).

Die Klassen DataAccessStudentDatabase und DataAccessStudentXmlFile implementieren jeweils dieses Interface.

In der Klasse DataAccessStudentDatabase werden die vom Interface vorgegebenen Methoden so implementiert, dass die Schülerdaten aus einer Datenbank gelesen beziehungsweise dort gespeichert werden.

JAVA
public class DataAccessStudentDatabase implements DataAccessStudent {

    public ArrayList<Student> readStudents() {
        // Anweisungen zum Laden aller Schülerdaten aus einer Datenbank.
    }

    public void saveStudent(Student pStudent) {
        // Anweisungen zum Speichern der Daten von pStudent in einer Datenbank.
    }

    // ...

}
Abb. 21-2: Klasse DataAccessStudentDatabase (Quellcode).

Die Klasse DataAccessStudentXmlFile implementiert diese Methoden derart, dass die Schülerdaten aus einer XML-Datei gelesen beziehungsweise dort gespeichert werden.

JAVA
public class DataAccessStudentXmlFile implements DataAccessStudent {

    public ArrayList<Student> readStudents() {
        // Anweisungen zum Laden aller Schülerdaten aus einer XML-Datei.
    }

    public void saveStudent(Student pStudent) {
        // Anweisungen zum Speichern der Daten von pStudent in einer XML-Datei.
    }

    // ...

}
Abb. 21-3: Klasse DataAccessStudentXmlFile (Quellcode).
In der Klasse SchoolAdministration kann dem Attribut dataAccessStudent nun ein Objekt der Klasse DataAccessStudentDatabase, ein Objekt der Klasse DataAccessStudentXmlFile oder ein Objekt irgendeiner anderen Klasse, die das Interface DataAccessStudent implementiert hat, zugewiesen werden.
JAVA
public class SchoolAdministration {

    private DataAccessStudent dataAccessStudent; {

    // ...

}
Abb. 21-4: Klasse SchoolAdministration (Quellcode).