1. Introducción
En muchos lenguajes de programación, el concepto de devoluciones de llamada de funciones está presente. Hay punteros de funciones en C y C ++, por lo que las funciones se pueden pasar como parámetros a otras funciones para una llamada posterior. En JavaScript, las devoluciones de llamada de funciones se llevan al extremo. El manejo de varios eventos, especialmente los eventos asincrónicos, se completan básicamente por devoluciones de llamada de funciones.
En Java, también se pueden implementar devoluciones de llamada de funciones. Aunque no hay un puntero de función, Java puede obtener un método de clase a través de un mecanismo de reflexión, pasarlo a otras funciones como un parámetro de tipo java.lang.reflect.method y luego llamar a la función a través del método de invocación del objeto del método.
Sin embargo, los pasos de llamada de esta manera son relativamente engorrosos, ineficientes en ejecución y difíciles de depurar. En Java, hay un mecanismo que es más elegante que las devoluciones de llamada de funciones, es decir, interfaces.
2. ¿Por qué necesitan las devoluciones de llamada de funciones?
Las devoluciones de llamada de funciones son en realidad una forma de retrasar la implementación de ciertas funciones.
Si sabemos de antemano qué operaciones debe realizar el programa, entonces no hay necesidad de devoluciones de llamada de función, y se puede implementar directamente durante la programación.
Pero muchas veces, cuando se escribe código, especialmente cuando se escriben clases de herramientas, bibliotecas o marcos de funciones, se implementan funciones relativamente generales y abstractas, mientras que los desarrolladores implementan funciones en escenarios específicos que utilizan estas clases.
Las devoluciones de llamada de funciones pueden resolver esta situación en la que no conoce la implementación específica de antemano.
Ejemplos de clasificación de funciones
Por ejemplo, cuando queremos implementar una función de clasificación general, no sabemos de antemano qué tipos de elementos usarán otros desarrolladores para clasificar, y no sabemos qué estándares juzgar la relación parcial (tamaño) de estos elementos.
Por lo tanto, se puede requerir que otros desarrolladores proporcionen una función de comparación al usar funciones de clasificación, para que podamos usar comparar para comparar el tamaño de los elementos que se clasificarán sin saber de antemano qué tipo de elementos es, ni la implementación específica de la comparación.
Aquí, la función de comparación es una función de devolución de llamada para la función de clasificación.
El pseudo-código se representa de la siguiente manera:
// La función de clasificación general void sort (objeto [] matriz, método compare) {// Use la función de comparación para comparar la relación de tamaño de los elementos en la matriz // clasificar la matriz} // La función de comparación específica es implementada por el llamado int -comparar (objeto A, objeto b) {// Compare los elementos A y B y el retorno de la relación tamaño}Ejemplo de funciones de procesamiento asíncrono
Por ejemplo, cuando escribimos una función de procesamiento asincrónico, no sabemos de antemano qué deben hacer otros desarrolladores cuando se complete el procesamiento, porque estas operaciones solo se pueden conocer al usar la función en un escenario específico.
Por lo tanto, se puede requerir que los desarrolladores proporcionen una devolución de llamada de la función de devolución de llamada al usar esta función. De esta manera, cuando escribimos funciones de procesamiento asíncrono, podemos llamar a la función de devolución de llamada para realizar algún trabajo final sin saber cuál es este trabajo final de antemano.
El pseudo-código se representa de la siguiente manera:
// función de procesamiento async void asynprocess (método devolución de llamada) {// ejecutar asynchronous tarea tallback ();} // La función de devolución de llamada específica void Callback () es implementada por la persona que llama {// las operaciones que se realizarán después de que se complete el procesamiento asíncrono}}3. Use la interfaz en lugar de la devolución de llamada de funciones
Mencionamos anteriormente que la razón por la cual se usa la devolución de llamada de la función es porque no conocemos la implementación específica de ciertas funciones por adelantado, por lo que la implementación específica se deja a otros desarrolladores para completar.
¿Crees que esta oración parece describir la interfaz Java? Una interfaz es una definición abstracta de un conjunto de métodos, y la clase completa la implementación específica que implementa la interfaz.
Por lo tanto, el uso de las dos características de las devoluciones de funciones orientadas a objetos y orientadas a la interfaz se pueden reemplazar.
Damos los dos ejemplos anteriores para ilustrar cómo una interfaz reemplaza una devolución de llamada de función.
Clasificar funciones
Utilizando una interfaz para implementar la función de clasificación, ya no requiere que los desarrolladores proporcionen la función de devolución de llamada en comparación con el uso de la función de clasificación, pero requiere que los desarrolladores se aseguren de que los elementos se clasifiquen implementen la interfaz comparable. Según la premisa de que "los elementos a ordenar ya han implementado la interfaz comparable", podemos implementar la función de clasificación sin conocer el tipo de elementos que se clasificarán.
// función de clasificación general void sort (object [] array) {// usa el método comparable de comparación comparable de comparación // Compare el tamaño de los elementos para ordenar la matriz. } // interfaz definida por clasificación de la función pública interfaz comparable {public int compareTo (objeto otro);} // implementar interfaz comparable Elemento de clase pública implementa comparable {@Override public int Compareto (objeto otro) {// juzga la relación de tamaño actual entre el elemento y el otro // y devuelve la relación entre los dos}}Funciones de procesamiento asíncrono
Al usar interfaces para implementar funciones de procesamiento asincrónicas, el desarrollador no requiere la devolución de llamada de la función de devolución de llamada, pero requiere un objeto que implementa la interfaz especificada, que refleja bien la idea orientada a objetos de Java. En comparación con proporcionar una función, un objeto contiene más información y es más flexible de usar. Pero esencialmente, esta función de procesamiento asincrónico todavía usa la interfaz para completar el trabajo de acabado.
// Función de procesamiento de async void asynprocess (ActionListener al) {// Ejecutar tareas asíncronas al.actionperformed ();} // interfaz definida por la función de procesamiento asíncrono de procesamiento public interface actionListener {void accionperformed ();} // implement // Se necesita trabajo adicional cuando se completa la función de procesamiento asíncrono}} // llamando a la función de procesamiento asíncrono public static void main (string [] args) {asynprocess (new extratask ());}4. Resumen
El método de devolución de llamada se puede resumir como: Implementación de una función de función general. Al llamar a esta función general en un escenario específico, la persona que llama debe proporcionar una devolución de llamada adecuada de la función de devolución de llamada. FUNCIÓN GENERAL FUNC utiliza esta función de devolución de llamada para completar las tareas en escenarios específicos.
La forma de implementar la interfaz es: implementar una función de función general. Al llamar a esta función general en un escenario específico, el objeto que está operando debe implementar la interfaz apropiada por sí misma. La función general utilizará esta interfaz para completar las tareas en el escenario específico.
El uso de devoluciones de llamada o interfaces de función puede resolver la situación en la que no conoce la implementación específica de antemano. El método de devolución de llamada de función pasa una función, mientras que el método de interfaz pasa un objeto que implementa la interfaz.
En Java, las devoluciones de llamada de funciones deben completarse utilizando mecanismos de reflexión, que son propensos a los errores y son ineficientes. El uso de interfaces puede hacer que la lógica del código sea más clara, más eficiente y más fácil de depurar.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.