Advanced   Java   Services Interfaces als Ersatz für Funktionspointer Back Next Up Home

Funktionspointer sind eine elegante Sache in C/C++ . Man übergibt einer Funktion einen Pointer auf eine andere Funktion. Der übergebene Pointer kann dann von der Funktion dereferenziert werden, d.h. die Funktion, auf die der Pointer zeigt, wird aufgerufen. Je nachdem, auf welche Funktion der Pointer zeigt, kann man also verschiedene Funktionen (allerdings mit der gleichen Signatur) aufrufen.

Es gibt zwar in Java keine Funktionspointer, aber mit Hilfe von Interfaces kann man einen Ersatz konstruieren, der auch recht flexibel ist. Wir geben uns ein Interface vor, das wir, um die Analogie zu verdeutlichen Function nennen und das eine abstrakte Methode call() deklariert.

interface Function
{
   void call();
}

Nun schreiben wir zwei unterschiedliche Realisierungen dieses Interfaces.

class Function1 implements Function
{
   public void call()
   {
      System.out.println("call von Function1");
   }
}

Und nun die zweite Realisierung

class Function2 implements Function
{
   public void call()
   {
      System.out.println("call von Function2");
   }
}

Sehr verschieden, nicht wahr, aber hier soll ja nur das Prinzip erklärt werden. Nun brauchen wir noch eine Methode, der wir unseren "Funktionspointer" übergeben. dazu schreiben wir eine Methode, die den Typ Function als Parameter erhält.

class Irgendeine
{
   void method(Function f)
   {
      f.call();
   }
}

Die Methode method macht einen Aufruf der Methode call aus dem Interface Function. Nun legen wir noch in main ein Objekt vom Typ Irgendeine an und rufen dazu die Methode method.

public static void main(String[] args)
{
   Irgendeine ie = new Irgendeine();

   ie.method( new Function1() ) ;

   ie.method( new Function2() ) ;

   ie.method( new Function()
                  {
                     public void call()
                     {
                        System.out.println("call aus anonymer Klasse");
                     }
                  }  // end anonymous class
            ) ;

} // end main

Wir übergeben hier der Methode method drei verschiedene Realisierungen des Interfaces Function. Damit werden in method() drei verschiedene Fassungen der Methode call gerufen.

Valid XHTML 1.0 Strict top Back Next Up Home