Devolución de llamada en C/C++: El mecanismo de llamar a una función desde otra función se llama devolución de llamada. La dirección de memoria de una función se representa como "puntero de función" en lenguajes como C y C++. Entonces, la devolución de llamada se logra pasando el puntero de la función1() a la función2().
Devolución de llamada en Java: Pero el concepto de función de devolución de llamada no existe en Java porque Java no tiene un concepto de puntero. Sin embargo, hay situaciones en las que se podría hablar de un objeto de devolución de llamada o de una interfaz de devolución de llamada. En lugar de pasar la dirección de memoria de una función Se pasa una interfaz que hace referencia a la ubicación de una función.
Ejemplo
Tomemos un ejemplo para comprender dónde se pueden utilizar las devoluciones de llamada. Supongamos que un programador quiere diseñar una calculadora de impuestos que calcule el impuesto total de un estado. Supongamos que sólo hay dos impuestos, el central y el estatal. El impuesto central es común, mientras que el impuesto estatal varía de un estado a otro. El impuesto total es la suma de los dos. Aquí se implementa un método separado como stateTax() para cada estado y se llama a este método desde otro método calcularTax() como:
static void calculateTax(address of stateTax() function) { ct = 1000.0 st = calculate state tax depending on the address total tax = ct+st; }
En el código anterior, la dirección de stateTax() se pasa acalculTax(). El método calcularTax() utilizará esa dirección para llamar al método stateTax() de un estado en particular y se calcula el impuesto estatal "st".
Dado que el código del método stateTax() cambia de un estado a otro, es mejor declararlo como un método abstracto en una interfaz como:
interface STax { double stateTax(); }
La siguiente es la implementación de stateTax() para el estado de Punjab:
class Punjab implements STax{ public double stateTax(){ return 3000.0; } }
La siguiente es la implementación de stateTax() para el estado de HP:
class HP implements STax { public double stateTax() { return 1000.0; } }
Ahora el método calcularTax() se puede diseñar como:
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); } Aquí observe el parámetro 'STax t' en el método calcularTax(). 't' es una referencia de la interfaz 'STax' que se pasa como parámetro al método. Usando esta referencia, el método stateTax() se llama como:
double st = t.stateTax();
Aquí, si 't' se refiere al método stateTax() de la clase Punjab, entonces se llama a ese método y se calcula su impuesto. Lo mismo ocurre con la clase HP. De esta manera, al pasar la referencia de la interfaz al método calcularTax() es posible llamar al método stateTax() de cualquier estado. esto se llama mecanismo de devolución de llamada.
Al pasar la referencia de interfaz que hace referencia a un método, es posible llamar y utilizar ese método desde otro método.
// 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); } }
Producción:
Enter the state name Punjab Total tax = 5000.0
Referencias:
¿Cómo implementar funciones de devolución de llamada en Java?
Core Java: un enfoque integrado