logo

Takaisinsoitto Java-liitäntöjen avulla

Takaisinsoitto C/C++:ssa: Mekanismia funktion kutsumiseksi toisesta funktiosta kutsutaan takaisinkutsuksi. Funktion muistiosoite esitetään "funktioosoittimena" kielissä, kuten C ja C++. Joten takaisinsoitto saavutetaan siirtämällä funktion 1() osoitin funktioon 2().
Takaisinsoitto Javassa: Mutta takaisinsoittofunktion käsitettä ei ole Javassa, koska Javalla ei ole osoitinkonseptia. On kuitenkin tilanteita, joissa voidaan puhua takaisinsoittoobjektista tai takaisinsoittorajapinnasta. Sen sijaan, että välität funktion muistiosoitteen välitetään käyttöliittymä, joka viittaa funktion sijaintiin.
 

Esimerkki


Otetaan esimerkki, jotta ymmärrämme, missä takaisinsoittoja voidaan käyttää. Oletetaan, että ohjelmoija haluaa suunnitella verolaskurin, joka laskee valtion kokonaisveron. Oletetaan, että on vain kaksi veroa keskus- ja valtionvero. Keskusvero on yleinen, kun taas valtion vero vaihtelee osavaltioittain. Kokonaisvero on näiden kahden summa. Tässä erillinen menetelmä, kuten stateTax() toteutetaan jokaiselle tilille ja kutsuu tätä menetelmää toisesta menetelmästä laskeaTax() seuraavasti:
 



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


Edellisessä koodissa stateTax()-osoite välitetään laskentaan Tax(). LaskeTax()-menetelmä käyttää tätä osoitetta tietyn osavaltion stateTax()-menetelmän kutsumiseen, ja osavaltiovero "st" lasketaan. 
Koska stateTax()-menetelmän koodi muuttuu tilasta toiseen, on parempi ilmoittaa se abstraktiksi menetelmäksi käyttöliittymässä seuraavasti: 
 

interface STax { double stateTax(); }


Seuraava on StateTax():n käyttöönotto Punjabin osavaltiossa: 
 

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


Seuraava on stateTax():n toteutus HP-tilalle: 
 

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


LaskeTax()-menetelmä voidaan nyt suunnitella seuraavasti: 
 

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

Tarkkaile tässä parametria 'STax t' laskentaTax() -menetelmässä. "t" on viite "STAx"-rajapinnalle, joka välitetään parametrina menetelmälle. Tätä viittausta käyttämällä stateTax()-menetelmää kutsutaan seuraavasti: 
 

double st = t.stateTax();


Tässä jos "t" viittaa Punjab-luokan stateTax()-menetelmään, kyseinen menetelmä kutsutaan ja sen vero lasketaan. Sama luokka HP. Tällä tavalla välittämällä rajapintaviittauksen laskentaTax()-menetelmään on mahdollista kutsua minkä tahansa tilan stateTax()-metodia. Tätä kutsutaan takaisinsoittomekanismi.
Ohjaamalla menetelmään viittaavan rajapintaviitteen on mahdollista kutsua ja käyttää kyseistä menetelmää toisesta menetelmästä.
 

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

Lähtö: 
 

Enter the state name Punjab Total tax = 5000.0


Viitteet: 
Kuinka ottaa takaisinsoittotoimintoja käyttöön Javassa?  
Java-ydin: Integroitu lähestymistapa

Luo tietokilpailu