In Java können Interfaces zur Nachbildung von Funktionszeigern verwendet werden.
Diese Anwendungsart von Interfaces ist besonders nützlich, wenn die Konfigurationsanforderungen einer Methode nicht durch die Übergabe von Variablen erfüllt werden können.
Die hier beschriebene Vorgehensweise wird bspw. bei Callback-Funktionen benötigt, wie sie für die Programmierung von grafischen Benutzeroberflächen verwendet werden.
Die Vorgehensweise für die Nachbildung von Funktionszeigern mittels Interfaces
Als erstes wird ein Interface definiert, in dem die erforderliche Methode abstrakt deklariert wird.
Dieses Interface wird anschließend von unterschiedlichen Klassen implementiert und dabei wird die Interface-Methode jeweils so umgesetzt, dass in ihr die erforderlichen Berechnungen durchgeführt werden.
Somit verfügt jede Klasse über eine eigene, an die Konfigurationsanforderungen angepasste, Implementierung der Interface-Methode.
Werden nun Instanzen dieser Klassen erzeugt und an die zu konfigurierende Methode übergeben, so wird in der zu konfigurierenden Methode jeweils genau die Methodenversion der jeweils instanzierten Klasse ausgeführt. Die jeweilige Methodenversion kann dadurch den Konfigurationsanforderungen entsprechend implementiert werden.
Eine Beispielanwendung für Interfaces als Funktionszeiger
Wir möchten nun eine Beispielanwendung in Java programmieren, die ein Interface für die Nachbildung eines Funktionszeigers verwendet. Dazu definieren wir das Interface CalculatorMethode, das die abstrakten Methoden getButtonType() und berechneWert(int a, int b) deklariert.
Weiterhin definieren wir vier Klassen, die alle unser Interface CalculatorMethode implementieren und jeweils eigene Versionen der beiden Interface-Methoden umsetzen.
In unserer Testklasse FunktionszeigerTest definieren wir die statische Methode gebeWerteAus(CalculatorMethode cmObjekt, int a, int b), die für jedes übergebene Objekt die entsprechende Berechnung ausführen lässt und die berechneten Werte auf der Konsole ausgibt.
Die Methode gebeWerteAus(CalculatorMethode cmObjekt, int a, int b) ist die zu konfigurierende Methode, der wir die Instanzen unserer Klassen ButtonPlus, ButtonMinus, ButtonMal und ButtonGeteiltDurch als erstes Argument übergeben, gefolgt von zwei Ganzzahlen für die Berechnung.
Die zu konfigurierende Methode gebeWerteAus(CalculatorMethode cmObjekt, int a, int b) erwartet als erstes Argument ein Objekt vom Typ CalculatorMethode. Unsere vier Klassen ButtonPlus, ButtonMinus, ButtonMal und ButtonGeteiltDurch implementieren alle das Interface CalculatorMethode und sind daher zu dem Datentyp des Interfaces kompatibel (CalculatorMethode). Somit können wir der zu konfigurierenden Methode Instanzen unserer vier Klassen als erstes Argument übergeben.
Da anhand des Datentyps der übergebenen Instanz entschieden wird, welche Methodenversion der Interface-Methode ausgeführt werden soll, ist unsere Methode gebeWerteAus(CalculatorMethode cmObjekt, int a, int b) somit konfigurierbar geworden.
Die Funktionsweise der hier beschriebenen Beispielanwendung für Interfaces als Funktionszeiger kann am besten anhand des unten abgebildeten Quellcodes nachvollzogen werden:
Beispielanwendung: Die Testklasse Interface als Funktionszeiger
/* * Beispielanwendung: die Testklasse für ein Interface als Funktionszeiger */ interface CalculatorMethode { public abstract String getButtonType(); // wird implizit als public abstract deklariert int berechneWert(int a, int b); } class ButtonPlus implements CalculatorMethode { public String getButtonType() { return "PLUS"; } public int berechneWert(int a, int b) { return a + b; } } class ButtonMinus implements CalculatorMethode { public String getButtonType() { return "MINUS"; } public int berechneWert(int a, int b) { return a - b; } } class ButtonMal implements CalculatorMethode { public String getButtonType() { return "MAL"; } public int berechneWert(int a, int b) { return a * b; } } class ButtonGeteiltDurch implements CalculatorMethode { public String getButtonType() { return "GETEILT DURCH"; } public int berechneWert(int a, int b) { return a / b; } } public class FunktionszeigerTest { public static void gebeWerteAus(CalculatorMethode cmObjekt, int a, int b) { int ergebnis = cmObjekt.berechneWert(a, b); String buttonType = cmObjekt.getButtonType(); System.out.println("\nDer " + buttonType + "-Button wurde geklickt."); System.out.println(a + " " + buttonType + " " + b + " = " + ergebnis); } public static void main (String[] args) { ButtonPlus bplusObjekt = new ButtonPlus(); ButtonMinus bminusObjekt = new ButtonMinus(); ButtonMal bmalObjekt = new ButtonMal(); ButtonGeteiltDurch bgeteiltObjekt = new ButtonGeteiltDurch(); gebeWerteAus(bplusObjekt, 20, 10); gebeWerteAus(bminusObjekt, 20, 10); gebeWerteAus(bmalObjekt, 20, 10); gebeWerteAus(bgeteiltObjekt, 20, 10); } }
Starten wir nun unser Java-Programm. Die Konsolenausgabe unserer Beispielanwendung ist in der unteren Abbildung dargestellt:
Mit dem nachfolgenden Link kommt ihr zurück zum Java Kurs.
Comments 3
Pingback: Interfaces (Schnittstellen) in Java
Pingback: Innere Klassen - Mit anonymer Klasse Funktionszeiger nachbilden Java
Pingback: Innere Klassen in Java - Nichtstatische lokale Klassen