logo

Richiamata utilizzando le interfacce in Java

Richiamata in C/C++: Il meccanismo per chiamare una funzione da un'altra funzione è chiamato callback. L'indirizzo di memoria di una funzione è rappresentato come "puntatore a funzione" nei linguaggi come C e C++. Quindi il callback si ottiene passando il puntatore di function1() a function2().
Richiamata in Java: Ma il concetto di funzione di callback non esiste in Java perché Java non ha il concetto di puntatore. Tuttavia ci sono situazioni in cui si potrebbe parlare di un oggetto di callback o di un'interfaccia di callback. Invece di passare l'indirizzo di memoria di una funzione viene passata l'interfaccia che fa riferimento alla posizione di una funzione.
 

rotazione dell'albero avl

Esempio


Facciamo un esempio per capire dove possono essere utilizzati i callback. Supponiamo che un programmatore voglia progettare un calcolatore delle tasse che calcoli le tasse totali di uno stato. Supponiamo che ci siano solo due tasse, quella centrale e quella statale. La tassa centrale è comune mentre la tassa statale varia da uno stato all'altro. L'imposta totale è la somma delle due. Qui un metodo separato come stateTax() è implementato per ogni stato e chiama questo metodo da un altro metodo calcolaTax() come:
 



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


Nel codice precedente l'indirizzo di stateTax() viene passato a calcolaTax(). Il metodo calcolaTax() utilizzerà quell'indirizzo per chiamare il metodo stateTax() di un particolare stato e verrà calcolata l'imposta statale "st". 
Poiché il codice del metodo stateTax() cambia da uno stato a un altro, è meglio dichiararlo come metodo astratto in un'interfaccia come: 
 

interface STax { double stateTax(); }


Quella che segue è l'implementazione di stateTax() per lo stato del Punjab: 
 

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


Quella che segue è l'implementazione di stateTax() per lo stato HP: 
 

interfaccia vs classe astratta
class HP implements STax { public double stateTax() { return 1000.0; } }


Ora il metodo calcolaTax() può essere progettato come: 
 

strsep c
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); }

Qui osservare il parametro 'STax t' nel metodo calcolaTax(). "t" è un riferimento all'interfaccia "STax" che viene passata come parametro al metodo. Utilizzando questo riferimento il metodo stateTax() viene chiamato come: 
 

double st = t.stateTax();


Qui se "t" si riferisce al metodo stateTax() della classe Punjab, viene chiamato quel metodo e viene calcolata la sua tassa. Allo stesso modo per la classe HP. In questo modo passando il riferimento dell'interfaccia al metodo calcolaTax() è possibile chiamare il metodo stateTax() di qualsiasi stato. Questo si chiama meccanismo di richiamata.
Passando il riferimento all'interfaccia che fa riferimento a un metodo è possibile chiamare e utilizzare quel metodo da un altro metodo.
 

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);  } } 

Produzione: 
 

Enter the state name Punjab Total tax = 5000.0


Riferimenti: 
Come implementare le funzioni di callback in Java?  
Core Java: un approccio integrato

Crea quiz