Devolución de llamada usando interfaces en Java

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 function1() a function2().
Devolución de llamada en Java: Pero el concepto de una 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 usar las devoluciones de llamada. Supongamos que un programador quiere diseñar una calculadora de impuestos que calcule el impuesto total de un estado. Suponga que solo 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 computeTax() 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 acalculateTax(). El método de cálculo de impuestos() usará esa dirección para llamar al método de impuestos estatales() 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 de cálculo de impuestos() 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 de cálculo de impuestos(). ‘t’ es una referencia de la interfaz ‘STax’ que se pasa como parámetro al método. Usando esta referencia, se llama al método stateTax(), 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. Del mismo modo, para la clase HP. De esta manera, al pasar la referencia de la interfaz al método de cálculo de impuestos(), es posible llamar al método de impuestos estatales() de cualquier estado. Esto se llama mecanismo de devolución de llamada.
Al pasar la referencia de interfaz que se refiere a un método, es posible llamar y usar ese método desde otro método.
 

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

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
 

Publicación traducida automáticamente

Artículo escrito por ChippingEye2766 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *