logo

Rückruf über Schnittstellen in Java

Rückruf in C/C++: Der Mechanismus zum Aufrufen einer Funktion von einer anderen Funktion wird als Callback bezeichnet. Die Speicheradresse einer Funktion wird in Sprachen wie C und C++ als „Funktionszeiger“ dargestellt. Der Rückruf wird also erreicht, indem der Zeiger von Funktion1() an Funktion2() übergeben wird.
Rückruf in Java: Aber das Konzept einer Callback-Funktion existiert in Java nicht, da Java kein Zeigerkonzept hat. Es gibt jedoch Situationen, in denen man von einem Callback-Objekt oder einer Callback-Schnittstelle sprechen könnte. Anstatt die Speicheradresse einer Funktion zu übergeben Es wird eine Schnittstelle übergeben, die auf den Speicherort einer Funktion verweist.
 

Beispiel


Nehmen wir ein Beispiel, um zu verstehen, wo Rückrufe verwendet werden können. Angenommen, ein Programmierer möchte einen Steuerrechner entwerfen, der die Gesamtsteuer eines Staates berechnet. Angenommen, es gibt nur zwei zentrale Steuern und eine staatliche Steuer. Die zentrale Steuer ist üblich, während die staatliche Steuer von Staat zu Staat unterschiedlich ist. Die Gesamtsteuer ist die Summe beider. Hier wird für jeden Bundesstaat eine separate Methode wie stateTax() implementiert und diese Methode wird von einer anderen Methode berechneTax() wie folgt aufgerufen:
 



static void calculateTax(address of stateTax() function) { ct = 1000.0 st = calculate state tax depending on the address total tax = ct+st; }


Im vorangehenden Code wird die Adresse von stateTax() an berechneTax() übergeben. Die Methode „calculeTax()“ verwendet diese Adresse, um die Methode „stateTax()“ eines bestimmten Staates aufzurufen und die staatliche Steuer „st“ zu berechnen. 
Da sich der Code der Methode stateTax() von einem Zustand in einen anderen ändert, ist es besser, ihn als abstrakte Methode in einer Schnittstelle zu deklarieren: 
 

interface STax { double stateTax(); }


Das Folgende ist die Implementierung von stateTax() für den Bundesstaat Punjab: 
 

class Punjab implements STax{ public double stateTax(){ return 3000.0; } }


Das Folgende ist die Implementierung von stateTax() für HP State: 
 

class HP implements STax { public double stateTax() { return 1000.0; } }


Jetzt kann die Methode „calculeTax()“ wie folgt gestaltet werden: 
 

static void calculateTax(STax t) { // calculate central tax double ct = 2000.0; // calculate state tax double st = t.stateTax(); double totaltax = st + ct; // display total tax System.out.println(Total tax =+totaltax); }

Beachten Sie hier den Parameter „STax t“ in der Methode „calculeTax()“. „t“ ist eine Referenz der „STax“-Schnittstelle, die als Parameter an die Methode übergeben wird. Unter Verwendung dieser Referenz wird die Methode stateTax() wie folgt aufgerufen: 
 

double st = t.stateTax();


Wenn sich „t“ hier auf die stateTax()-Methode der Klasse Punjab bezieht, wird diese Methode aufgerufen und ihre Steuer berechnet. Ähnliches gilt für die Klasse HP. Auf diese Weise ist es durch Übergabe einer Schnittstellenreferenz an die Methode „calculeTax()“ möglich, die Methode „stateTax()“ eines beliebigen Staates aufzurufen. Das nennt man Rückrufmechanismus.
Durch Übergabe der Schnittstellenreferenz, die auf eine Methode verweist, ist es möglich, diese Methode von einer anderen Methode aus aufzurufen und zu verwenden.
 

Java
// Java program to demonstrate callback mechanism // using interface is Java // Create interface import java.util.Scanner; interface STax {  double stateTax(); } // Implementation class of Punjab state tax class Punjab implements STax {  public double stateTax()  {  return 3000.0;  } } // Implementation class of Himachal Pradesh state tax class HP implements STax {  public double stateTax()  {  return 1000.0;  } } class TAX {  public static void main(String[] args)  throws ClassNotFoundException IllegalAccessException InstantiationException  {  Scanner sc = new Scanner(System.in);  System.out.println('Enter the state name');  String state = sc.next(); // name of the state  // The state name is then stored in an object c  Class c = Class.forName(state);  // Create the new object of the class whose name is in c  // Stax interface reference is now referencing that new object  STax ref = (STax)c.newInstance();  /*Call the method to calculate total tax  and pass interface reference - this is callback .  Here ref may refer to stateTax() of Punjab or HP classes  depending on the class for which the object is created  in the previous step  */  calculateTax(ref);  }  static void calculateTax(STax t)  {  // calculate central tax  double ct = 2000.0;  // calculate state tax  double st = t.stateTax();  double totaltax = st + ct;  // display total tax  System.out.println('Total tax =' + totaltax);  } } 

Ausgabe: 
 

Enter the state name Punjab Total tax = 5000.0


Referenzen: 
Wie implementiert man Rückruffunktionen in Java?  
Core Java: Ein integrierter Ansatz

Quiz erstellen