logo

Обратно повикване с помощта на интерфейси в Java

Обратно извикване в C/C++: Механизмът за извикване на функция от друга функция се нарича обратно извикване. Адресът на паметта на функция се представя като „указател на функция“ в езици като C и C++. Така че обратното извикване се постига чрез предаване на указателя на function1() към function2().
Обратно повикване в Java: Но концепцията за функция за обратно извикване не съществува в Java, защото Java няма концепция за указател. Има обаче ситуации, в които може да се говори за обект за обратно извикване или интерфейс за обратно извикване. Вместо да предава адреса на паметта на функция се предава интерфейс, който се отнася до местоположението на функция.
 

java util дата

Пример


Нека вземем пример, за да разберем къде могат да се използват обратни извиквания. Да предположим, че програмист иска да проектира данъчен калкулатор, който изчислява общия данък на държавата. Да приемем, че има само два данъка: централен и държавен данък. Централният данък е общ, докато държавният данък варира от един щат до друг. Общият данък е сумата от двете. Тук отделен метод като stateTax() се прилага за всяко състояние и извиква този метод от друг метод CalculateTax() като:
 



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


В предходния код адресът на stateTax() се предава на calculateTax(). Методът calculateTax() ще използва този адрес, за да извика метода stateTax() на конкретен щат и се изчислява държавният данък „st“. 
Тъй като кодът на метода stateTax() се променя от едно състояние в друго, по-добре е да го декларирате като абстрактен метод в интерфейс като: 
 

interface STax { double stateTax(); }


Следното е изпълнението на stateTax() за щата Пенджаб: 
 

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


Следното е изпълнението на stateTax() за състояние на HP: 
 

java математика
class HP implements STax { public double stateTax() { return 1000.0; } }


Сега методът calculateTax() може да бъде проектиран като: 
 

centos срещу rhel
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); }

Тук наблюдавайте параметъра „STax t“ в метода calculateTax(). „t“ е препратка към интерфейса „STax“, който се предава като параметър на метода. Използвайки тази препратка, методът stateTax() се извиква като: 
 

double st = t.stateTax();


Тук, ако „t“ се отнася до метода stateTax() на клас Punjab, тогава този метод се извиква и неговият данък се изчислява. По същия начин за клас HP. По този начин чрез предаване на интерфейсна препратка към метода calculateTax() е възможно да се извика метод stateTax() на всяко състояние. Това се нарича механизъм за обратно извикване.
Чрез предаване на препратката към интерфейса, която се отнася до метод, е възможно да се извика и използва този метод от друг метод.
 

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

Изход: 
 

Enter the state name Punjab Total tax = 5000.0


препратки: 
Как да внедрим функции за обратно извикване в Java?  
Core Java: Интегриран подход

Създаване на тест