Prefacio
La devolución de llamada significa devolución de llamada. Las personas que están familiarizadas con la programación de Windows deben estar familiarizadas con las cuatro palabras "función de devolución de llamada", pero los programadores de Java pueden no saber mucho al respecto. La "función de devolución de llamada" o el "método de devolución de llamada" es un concepto muy importante en el diseño y el desarrollo de software. Es muy necesario para los programadores (independientemente del idioma).
Recientemente, aprendí a Java y entré en contacto con el mecanismo de devolución de llamada (devolución de llamada). Cuando me conocí, me sentí bastante confundido, y las explicaciones relevantes que busqué en línea se mencionaron o dijeron simplemente, como si hubiera definido la devolución de llamada. Por supuesto, después de entender la devolución de llamada, fui a leer las diversas explicaciones en línea, y no hubo problema. Sin embargo, para mí que es un principiante, me falta un proceso gradual. Aquí, describiré mi comprensión personal del mecanismo de devolución de llamada en el orden de superficie a profundo. Si hay alguna inapropiación, ¡espero darle consejos!
Antes de comenzar, imagine un escenario: los niños de jardín de infantes acaban de aprender su adición dentro de 10.
Capítulo 1. El origen de la historia
El maestro de jardín de infantes escribió una fórmula "1 + 1 =" en la pizarra, y Xiao Ming llenaba los espacios en blanco.
Desde que aprendí la adición de menos de 10, Xiao Ming puede calcular esta pregunta por completo por sí mismo. El código para simular el proceso es el siguiente:
estudiante de clase pública {private string name = null; public student (name de cadena) {// toDo constructor generado automático stubthis.name = name;} public void setName (name de cadena) {this.name = name;} private int calcadd (int a, int b) {return a + b;} public void rellan b); system.out.println (nombre + "aritmética mental:" + a + " +" + b + "=" + resultado);}} Cuando Xiao Ming estaba llenando los espacios en blanco, calculó directamente el clacadd y descubrió que el resultado fue 2 y escribió el resultado en el espacio. El código de prueba es el siguiente:
Prueba de clase pública {public static void main (string [] args) {int a =; int b =; estudiante s = nuevo estudiante ("xiao ming"); s.fillblank (a, b);}} Los resultados de la operación son los siguientes:
Aritmética mental de Xiao Ming: 1 + 1 = 2
Este proceso se realiza completamente por el objeto de instancia de la clase de estudiantes solo y no implica un mecanismo de devolución de llamada.
Capítulo 2. La búsqueda de problemas para los maestros de jardín de infantes
Durante el descanso, el maestro de jardín de infantes de repente tuvo un capricho y escribió "168 + 291 =" en la pizarra para dejar que Xiao Ming lo completara y luego regresó a la oficina.
¡Fro de flores! ¿Por qué no todos los maestros no pueden llevarse bien con Xiao Ming? Obviamente está más allá de las reglas, ¿de acuerdo? En este momento, Xiao Ming obviamente no podía completarlo por aritmética mental como la anterior. ¡Cuando estaba confundido, Xiao Hong en la clase entregó una calculadora que solo podía calcular la adición (un ganador)! ! ! ! Xiao Ming sabía cómo usar una calculadora, por lo que calculó los resultados a través de la calculadora y completó el relleno en blanco.
El código para la calculadora es:
Calculadora de clase pública {public int add (int a, int b) {return a + b;}} Modifique la clase de estudiante y agregue un método para usar la calculadora:
public class Student{private String name = null;public Student(String name){// TODO Auto-generated constructor stubthis.name = name;}public void setName(String name){this.name = name;}@SuppressWarnings("unused")private int calcADD(int a, int b){return a + b;}private int useCalculator(int a, int b){return new Calculator (). Add (a, b);} public void Fillblank (int a, int b) {int resultado = useCalculator (a, b); system.out.println (nombre + "use calculador:" + a + " +" + b + "=" + resultado);}}}} El código de prueba es el siguiente:
Prueba de clase pública {public static void main (string [] args) {int a =; int b =; estudiante s = nuevo estudiante ("xiao ming"); s.fillblank (a, b);}} Los resultados de la operación son los siguientes:
Xiao Ming usa la calculadora: 168 + 291 = 459
El mecanismo de devolución de llamada no ha estado involucrado en este proceso, pero parte del trabajo de Xiao Ming ha sido transferido y será asistido por la calculadora.
3. El profesor de jardín de infantes ha vuelto
Cuando descubrí que Xiao Ming había completado la adición de 3 dígitos, el maestro pensó que Xiao Ming era muy inteligente y un talento maleable. Entonces escribió "26549 + 16487 =" en la pizarra, pidiéndole a Xiao Ming que complete el relleno en blanco antes de la clase, y luego regresó a la oficina.
Xiao Ming miró al pequeño amigo que se estaba divirtiendo fuera del aula y no pudo evitar sentirse triste. Si no sales a jugar, ¡este descanso se arruinará! ! ! ! Mirando la calculadora que Xiaohong la entregó nuevamente, a Xiao Ming se le ocurrió un plan: deja que Xiaohong lo haga por él.
Xiao Ming le dijo a Xiaohong que la pregunta era "26549 + 16487 =", luego señaló la ubicación específica para completar los resultados, y luego salió a divertirse.
Aquí, no implementamos XiaoHong solo, pero consideramos esta calculadora que solo puede calcular la adición y Xiaohong en su conjunto, una súper calculadora que puede calcular los resultados y llenar los espacios en blanco. Los parámetros que esta súper calculadora debe pasar son las dos adiciones y la posición para llenar los espacios en blanco, y estos contenidos deben informarse de antemano, es decir, Xiao Ming quiere exponer parte de sus métodos a Xiao Hong. La forma más fácil es decirle a Xiao Hong su referencia y las dos adiciones juntas.
Por lo tanto, el método Agregar del supercalculador debe contener dos operandos y una referencia al propio Xiao Ming, el código es el siguiente:
Supercalculator de clase pública {public void add (int a, int b, estudiante xiaoming) {int resultado = a + b; xiaoming.fillblank (a, b, resultado);}} Xiao Ming ya no necesita aritmética mental o calculadora, por lo que solo necesita tener un método para pedirle ayuda a Xiaohong. El código es el siguiente:
Public Class Student {private String name = null; public student (name de cadena) {// toDO Constructor generado automático stubthis.name = name;} public void setName (name de cadena) {this.name = name;} public void Callhelp (int a, int b) {New SuperCalculator (). ADD (A, B, este);} Void Void FellBlan resultado) {System.out.println (nombre + "Buscando el cálculo de XiaoHong:" + A + " +" + B + "=" + resultado);}} El código de prueba es el siguiente:
Prueba de clase pública {public static void main (string [] args) {int a =; int b =; estudiante s = nuevo estudiante ("xiao ming"); s.callhelp (a, b);}} El resultado de la ejecución es:
Xiao Ming pidió ayuda Xiaohong para calcular: 26549 + 16487 = 43036
El proceso de ejecución es: Xiao Ming llama al método ADD de Xiaohong (nuevo SuperCalculator ()) a través de su propio método CallHelp, y hace referencia a su propia referencia al llamar.
(esto) Pasélo como parámetro. Después de que Xiaohong usó la calculadora para obtener el resultado, llamó al método Fillblank de Xiao Ming y llenó el resultado en el espacio en la pizarra.
Luces y luces! En este punto, la función de devolución de llamada debutó oficialmente. El método Fillblank de Xiao Ming es lo que a menudo nos llamamos la función de devolución de llamada.
De esta manera, se puede ver claramente que Xiao Ming ya no necesita esperar hasta que se complete la adición y el resultado se llene en la pizarra antes de que pueda divertirse con sus amigos. El trabajo de relleno en el blanco es realizado por Xiaohong, la súper calculadora. Las ventajas de las devoluciones de llamada han comenzado a reflejarse.
Capítulo 4. La suegra en la puerta
Hay una anciana con cabello gris en la entrada del jardín de infantes. Ella instaló un puesto de calle allí vendiendo comida chatarra que casi caduca todos los días, independientemente del viento y la lluvia. Como soy viejo, mi mente está un poco confundida y a menudo no puedo entender cuánto dinero he ganado. Un día, accidentalmente escuchó a Xiao Ming presumir sobre cómo luchó contra el ingenio y el coraje con la maestra de jardín de infantes con la ayuda de Xiaohong. Entonces, mi suegra decidió encontrar la pequeña calculadora de la tarjeta roja para ser su pequeño ayudante y proporcionar un paquete de tiras picantes de Weilong como recompensa. Xiaohong no pudo resistir la tentación y estuvo de acuerdo.
Mirando hacia atrás en el código en el capítulo anterior, encontramos que los parámetros requeridos por el método Agregar de la pequeña calculadora de la tarjeta roja son dos variables enteras y un objeto de estudiante, pero la anciana no es una estudiante, sino una pequeña proveedor, por lo que debe hacer modificaciones aquí. En este caso, es natural para nosotros pensar en la herencia y el polimorfismo. Si le pedimos al estudiante Xiao Ming y al proveedor de la anciana que herede de una clase de padres, entonces solo necesitamos pasar una referencia a la clase de los padres a la pequeña calculadora de la tarjeta roja.
Sin embargo, en uso real, teniendo en cuenta la herencia única de Java y no queriendo exponer demasiado de sí mismo a los demás, utilizamos el método de heredar de la interfaz para cooperar con clases internas.
En otras palabras, Xiaohong espera continuar brindando servicios de cálculo a los niños en la clase en el futuro, y al mismo tiempo proporcionar servicios contables a la anciana e incluso expandir los negocios de otras personas en el futuro. Así que ella estuvo de acuerdo con todos los clientes un método para el procesamiento unificado, es decir, los operandos que necesita y cómo hacerlo después de completar el cálculo. Xiaohong convirtió este método unificado en una interfaz y se proporcionó a todos, el código es el siguiente:
interfaz pública doJob {public void fillblank (int a, int b, int resultado);} Debido a que la inspiración provino de ayudar a Xiao Ming a llenar los espacios en blanco, Xiaohong retuvo su intención original y trató todo su negocio como Fillblank.
Al mismo tiempo, Xiaohong modificó su calculadora para que pueda manejar a diferentes personas que implementan la interfaz DOJOB al mismo tiempo. El código es el siguiente:
Public Class SuperCalculator {public void add (int a, int b, doJob Customer) {int resultado = a + b; customer.fillblank (a, b, resultado);}} Después de que Xiao Ming y la anciana obtuvieron esta interfaz, siempre que implementaran esta interfaz, es equivalente a decirle a Xiaohong la forma de manejar los resultados en un modelo unificado y usar clases internas como se mencionó anteriormente. El código es el siguiente:
Xiao Ming:
estudiante de clase pública {private string name = null; public student (name de cadena) {// toDO Constructor generado automático stubthis.name = name;} public void setName (name de cadena) {this.name = name;} public class DoHomeWork Implements DoJOB {@Overrideppublic void Fillblan stubsystem.out.println (nombre + "buscando el cálculo de Xiaohong:" + a + " +" + b + "=" + resultado);}} public void callHelp (int a, int b) {nuevo supercalculador (). ADD (A, B, New DoHomework ());}} La anciana:
Seller de clase pública {private String name = null; public Seller (name de cadena) {// tODO Constructor generado automático stubthis.name = name;} public void setName (name de cadena) {this.name = name;} public class DoHomework impregna DoJOB {@Overridepublic Vaide FillBlank (int a, intb, intb) {//////////////////1 met Methodeated stubsystem.out.println (nombre + "Buscando ayuda XiaoHong para resolver las cuentas:" + a + " +" + b + "=" + resultado + "meta");}} public void callHelp (int a, int b) {nuevo supercalculador (). Agregar (a, b, nuevo dohomework ());}}} El procedimiento de prueba es el siguiente:
prueba de clase pública {public static void main (string [] args) {int a =; int b =; int c =; int d =; estudiante s = nuevo estudiante ("xiao ming"); vendedor s = nuevo vendedor ("abuela"); s.callhelp (a, b); s.callhelp (c, d);}} Los resultados de la operación son los siguientes:
Xiao Ming pidió ayuda Xiaohong para calcular: 56 + 31 = 87
La anciana pide ayuda de Xiaohong para liquidar cuentas: 26497 + 11256 = 37753 yuan
Las últimas palabras
Se puede ver claramente que Xiaohong ya ha tratado este asunto como una carrera, y lo sabrá observando el nombre que le dio a la interfaz DoJob.
Algunas personas pueden preguntar, ¿por qué una anciana puede ganar tanto dinero estableciendo un puesto? ¿Hay algún problema con su enfoque? ! ¡De lo que estamos hablando aquí es el mecanismo de devolución de llamada! !
Todo lo que sé es que el negocio de Xiaohong continuó expandiéndose más tarde, y antes de graduarse del jardín de infantes, finalmente compró su primera casa en su vida con el dinero que ganó.