interface enhancements java 8 java functional interface
Este tutorial explica las adiciones a la interfaz en Java 8 y las diferencias entre los conceptos de Java como una clase abstracta, una palabra clave extendida, etc. con las interfaces:
Exploramos todo sobre Interfaces en Java en nuestro último tutorial. Hemos introducido y cubierto los conceptos básicos de interfaces en Java, incluidas las múltiples interfaces.
Antes de Java 8, se permitía que las interfaces solo tuvieran métodos abstractos y variables estáticas y finales. Los métodos abstractos son públicos por defecto y deben ser anulados por la clase que implementa una interfaz.
Entonces, la interfaz era principalmente un contrato y solo estaba involucrada con constantes (estáticas y finales) y métodos abstractos.
=> Eche un vistazo a la guía para principiantes de Java aquí.
Lo que vas a aprender:
- Cambios de interfaces en Java 8
- Interfaces funcionales de Java 8
- Interfaz clase Vs en Java
- Java se extiende frente a los implementos
- Interfaz vs clase abstracta en Java
- Conclusión
Cambios de interfaces en Java 8
La versión de Java 8 introduce o nos permite tener métodos estáticos y predeterminados en las interfaces. Al usar métodos predeterminados en una interfaz, los desarrolladores pueden agregar más métodos a las interfaces. De esta forma no molestan ni cambian las clases que implementan la interfaz.
Java 8 también permite que la interfaz tenga un método estático. Los métodos estáticos son los mismos que definimos en las clases. Tenga en cuenta que el método estático no puede ser anulado por la clase que implementa la interfaz.
La introducción de métodos estáticos y predeterminados en la interfaz facilitó la modificación de las interfaces sin problemas y también facilitó la implementación de las interfaces.
Java 8 también presenta “Expresiones Lambda” dentro de interfaces funcionales. Además, desde Java 8 en adelante, se agregan más interfaces funcionales integradas en Java.
En este tutorial, discutiremos todas estas adiciones a las interfaces en Java 8 y también discutiremos algunas de las diferencias entre varios conceptos de Java como clases abstractas, palabras clave extendidas, etc. con las interfaces.
Método estático en la interfaz en Java
Las interfaces también pueden tener métodos que pueden tener definiciones. Estos son los métodos estáticos de la interfaz. Los métodos estáticos se definen dentro de la interfaz y no pueden ser anulados o cambiados por las clases que implementan esta interfaz.
Podemos llamar a estos métodos estáticos usando directamente el nombre de la interfaz.
El siguiente ejemplo demuestra el uso del método estático.
|_+_|Producción:
El programa anterior tiene una TestInterface. Tiene un método estático llamado 'static_print' y también un método no estático llamado nonstaticmethod.
Hemos implementado TestInterface en TestClass y anulado nonStaticMethod. Luego, en el método principal, llamamos al método static_print directamente usando TestInterface y nonStaticMethod usando el objeto de TestClass.
Método predeterminado de interfaz
Como ya se mencionó, las interfaces anteriores a Java 8 solo permitían métodos abstractos. Entonces proporcionaríamos la implementación de este método en una clase separada. Si tuviéramos que agregar un nuevo método a la interfaz, entonces tenemos que proporcionar su código de implementación en la misma clase.
Por tanto, si modificamos la interfaz añadiéndole un método, la clase de implementación también cambiaría.
Esta limitación fue superada por la versión de Java 8 que permitió que las interfaces tuvieran métodos predeterminados. Los métodos predeterminados de alguna manera proporcionan compatibilidad con versiones anteriores de las interfaces existentes y no necesitamos alterar la clase de implementación. Los métodos predeterminados también se conocen como 'método de extensión virtual' o 'métodos de defensa'.
Los métodos predeterminados se declaran utilizando la palabra clave 'predeterminado' en la declaración. La declaración va seguida de la definición del método. Podemos anular el método predeterminado ya que está disponible para la clase que implementa la interfaz.
De la misma manera, podemos invocarlo usando el objeto de clase de implementación directamente desde la interfaz sin anularlo.
|_+_|Producción:
top 10 software espía para teléfonos móviles
El programa Java anterior demuestra el método predeterminado en la interfaz. En el método principal, tenga en cuenta que podemos llamar al método predeterminado de la interfaz usando el objeto de clase. Esto se debe a que a medida que la clase implementa la interfaz, el método predeterminado también está disponible para la clase.
Nota: Podríamos haber anulado el método print () también en la clase de implementación. Tenga en cuenta que si se anula, el modificador de acceso del método predeterminado cambiará a público en la clase de implementación.
Métodos predeterminados y herencia múltiple
Podría surgir una situación en el caso de múltiples interfaces en la que cada interfaz podría tener un método predeterminado con el mismo prototipo. En tal caso, el compilador no sabe qué método invocar.
Cuando surge esta situación en la que el método predeterminado tiene el mismo prototipo en todas las interfaces, entonces la solución es anular el método en la clase de implementación para que cuando el objeto de la clase de implementación llame al método predeterminado, el compilador invoque el método implementado en la clase. .
El siguiente programa Java demuestra el uso del método predeterminado con múltiples interfaces.
|_+_|Producción:
En el programa anterior, hemos anulado el método predeterminado (que tiene el mismo prototipo en ambas interfaces) en la clase de implementación. De esta forma, cuando llamamos al método predeterminado desde el método principal utilizando el objeto de la clase de implementación, se invoca el método anulado.
Interfaces funcionales de Java 8
Una interfaz funcional es una interfaz que tiene un solo método abstracto. Puede contener cualquier número de métodos estáticos y predeterminados, pero el método abstracto que contiene es exactamente uno. Además, una interfaz funcional puede tener declaraciones de métodos de clases de objetos.
mejores sitios web para ver anime gratis
La interfaz funcional se conoce como ' Interfaz de método abstracto único ' o ' Interfaz SAM ”. La interfaz SAM es una característica nueva de Java.
En un programa Java, la presencia de una interfaz funcional se indica mediante un @FunctionalInterface anotación. Cuando el compilador encuentra esta anotación, entonces sabe que la interfaz que sigue a esta anotación es funcional. Por lo tanto, si contiene más de un método abstracto, muestra un error.
La anotación @FunctionalInterface sin embargo, no es obligatorio en Java.
El siguiente programa demuestra la interfaz funcional en Java:
|_+_|Producción:
La interfaz funcional en el programa anterior tiene un solo método abstracto y también tiene una declaración de método de clase de objeto como hashCode, toString y equals. En la clase que implementa esta interfaz, se anula el método abstracto. En el método principal, creamos un objeto de la clase de implementación y usamos el método.
Interfaces como Runnable y Comparable son ejemplos de interfaces funcionales proporcionadas en Java. Java 8 nos permite asignar expresiones lambda al objeto de interfaz funcional.
El siguiente programa de ejemplo demuestra esto.
|_+_|Producción:
Java 8 también proporciona muchas interfaces funcionales integradas en el paquete java.util.function.
Estas interfaces integradas se describen a continuación:
# 1) Predicado
Esta es una interfaz funcional en Java que tiene una única prueba de método abstracto. El método 'prueba' devuelve el valor booleano después de probar el argumento especificado.
A continuación se muestra el prototipo del método de prueba de la interfaz Predicate.
|_+_|# 2) Operador binario
La interfaz BinaryOperator proporciona un método abstracto 'aplicar' que acepta dos argumentos y devuelve un valor resultante del mismo tipo que los argumentos.
El prototipo del método de aceptación es:
|_+_|# 3) Función
La interfaz de función es una interfaz funcional que también tiene un método abstracto llamado 'aplicar'. Sin embargo, este método de aplicación toma un único argumento de tipo T y devuelve un valor de tipo R.
El prototipo del método de aplicación es el siguiente:
|_+_|El siguiente programa Java demuestra el predicado de interfaz funcional integrado anterior.
|_+_|Producción:
Como podemos ver en el programa anterior, tenemos una lista de cadenas. Usando la interfaz funcional Predicate, probamos si el elemento de la cadena comienza con M y, si lo hace, imprime el nombre.
Interfaz clase Vs en Java
Aunque la clase y la interfaz son similares ya que tienen una sintaxis similar, estas dos entidades tienen más diferencias que similitudes.
Enumeremos algunas de las diferencias entre clase e interfaz en Java.
Clase | Interfaz |
---|---|
Podemos instanciar y crear objetos a partir de una clase. | No se puede crear una instancia de una interfaz. |
La palabra clave 'clase' se utiliza para crear una clase. | La interfaz se crea utilizando la palabra clave 'interfaz'. |
Las clases no admiten la herencia múltiple en Java. | Las interfaces admiten herencia múltiple en Java. |
La clase contiene los constructores. | Las interfaces no contienen constructores. |
La clase no puede contener métodos abstractos. | Las interfaces contienen solo métodos abstractos. |
La clase puede tener variables y métodos predeterminados, públicos, privados o protegidos. | La interfaz solo tiene variables y métodos públicos por defecto. |
No es obligatorio asociar modificadores de no acceso con variables de la clase. | Las interfaces pueden tener variables estáticas o finales. |
Podemos heredar otra clase de una clase. | No podemos heredar una clase de la interfaz. |
La clase se puede heredar usando la palabra clave 'extiende'. | La interfaz puede ser implementada por otra clase usando la palabra clave 'implements'. Puede ser heredado por otra interfaz usando la palabra clave 'extiende'. |
Java se extiende frente a los implementos
'Extiende' | 'implementos' |
---|---|
Las interfaces solo admiten modificadores de no acceso estáticos y finales. | Abstract admite todos los modificadores que no son de acceso, como estático, final, no estático y no final. |
Una clase usa la palabra clave 'extiende' para heredar de otra clase. | Una clase utiliza la palabra clave 'implements' para implementar una interfaz. |
Una clase que hereda otra clase puede o no anular todos los métodos de la clase principal. | La clase que implementa la interfaz debe anular todos los métodos abstractos de la interfaz. |
Podemos extender solo una clase a la vez usando la palabra clave extiende. | Podemos implementar múltiples interfaces usando la palabra clave 'implements'. |
Una interfaz puede extender otra interfaz usando la palabra clave 'extiende'. | Una interfaz no puede implementar otra interfaz utilizando palabras clave 'implementa'. |
¿Puede la clase abstracta implementar la interfaz en Java?
Sí, una clase abstracta puede implementar una interfaz utilizando la palabra clave 'implements'. La clase abstracta no necesita implementar todos los métodos abstractos de interfaz. Pero en general, es una buena práctica de diseño tener una interfaz con todos los métodos abstractos, luego una clase abstracta que implemente esta interfaz y luego las clases concretas.
A continuación se muestra un ejemplo de una implementación de este tipo en Java.
Aquí java.util.List es una interfaz. Esta interfaz está implementada por java.util.AbstractList. Luego, esta clase AbstractList se extiende por dos clases concretas, es decir, LinkedList y ArrayList.
Si las clases LinkedList y ArrayList hubieran implementado la interfaz List directamente, entonces tendrían que implementar todos los métodos abstractos de la interfaz List.
Pero en este caso, la clase AbstractList implementa los métodos de la interfaz List y los pasa a LinkedList y ArrayList. Así que aquí tenemos la ventaja de declarar el tipo desde la interfaz y la flexibilidad de la clase abstracta para implementar el comportamiento común.
Cuándo usar la clase y la interfaz abstractas en Java
Usamos principalmente una clase abstracta para definir un comportamiento predeterminado o común de las clases secundarias que se extenderán desde esta clase abstracta. Una interfaz se utiliza para definir un contrato entre dos sistemas que interactúan en una aplicación.
Ciertas situaciones específicas son ideales para el uso de interfaces y ciertos problemas que se pueden resolver solo usando clases abstractas. En esta sección, discutiremos cuándo podemos usar la interfaz y cuándo podemos usar clases abstractas.
Cuándo usar una interfaz:
- Las interfaces se utilizan principalmente cuando tenemos una pequeña funcionalidad concisa para implementar.
- Cuando implementamos API y sabemos que no cambiarán por un tiempo, entonces optamos por las interfaces.
- Las interfaces nos permiten implementar herencia múltiple. Por lo tanto, cuando necesitamos implementar herencia múltiple en nuestra aplicación, optamos por interfaces.
- Cuando tenemos una amplia gama de objetos, nuevamente las interfaces son una mejor opción.
- Además, cuando tenemos que proporcionar una funcionalidad común a muchas clases no relacionadas, se siguen utilizando interfaces.
Cuándo usar una clase abstracta:
- Las clases abstractas se usan principalmente cuando necesitamos usar herencia en nuestra aplicación.
- Como las interfaces tratan con métodos y variables públicos, siempre que queremos usar modificadores de acceso no públicos en nuestro programa, usamos clases abstractas.
- Si es necesario agregar nuevos métodos, es mejor hacerlo en una clase abstracta que en una interfaz. Porque si agregamos un nuevo método en la interfaz, toda la implementación cambia, ya que las interfaces solo tienen prototipos de métodos y la implementación de clases que usa la interfaz proporcionará la implementación.
- Si queremos diferentes versiones de los componentes que se están desarrollando, optamos por la clase abstracta. Podemos cambiar las clases abstractas más fácilmente. Pero las interfaces no se pueden cambiar. Si queremos una nueva versión, tenemos que volver a escribir toda la interfaz.
- Cuando queremos proporcionar una implementación común para todos los componentes, la clase abstracta es la mejor opción.
Interfaz vs clase abstracta en Java
A continuación se muestran algunas de las diferencias entre las interfaces y las clases abstractas en Java.
Interfaz | Clase abstracta |
---|---|
Una interfaz se declara mediante la palabra clave 'interfaz'. | Una clase abstracta se declara utilizando la palabra clave 'abstracta'. |
La interfaz se puede implementar utilizando la palabra clave 'implements'. | El resumen se puede heredar mediante la palabra clave 'extiende'. |
Una interfaz no puede extender una clase o implementar una interfaz, solo puede extender otra interfaz. | Una clase abstracta puede extender una clase o implementar múltiples interfaces. |
Los miembros de la interfaz solo pueden ser públicos. | Los miembros de la clase abstracta pueden ser públicos, privados o protegidos. |
No se puede utilizar una interfaz para proporcionar una implementación. Solo se puede utilizar como declaración. | Se puede utilizar una clase abstracta para implementar la interfaz. |
Se puede lograr una herencia múltiple utilizando interfaces. | La clase abstracta no admite herencia múltiple. |
Las interfaces solo pueden tener métodos abstractos. Desde Java 8, puede tener métodos estáticos y predeterminados. | Una clase abstracta puede tener un método abstracto o no abstracto. |
Herencia de enumeración en Java
Hemos discutido los tipos de datos enum en nuestra discusión sobre tipos de datos en Java. Todas las enumeraciones se extienden desde la clase java.lang.Enum. Esta clase java.lang.Enum es una clase abstracta.
Además, todas las clases de enumeración en Java son 'finales' de forma predeterminada. Por lo tanto, un intento de heredar una clase de cualquier clase de enumeración da como resultado un error del compilador.
Como Java no permite la herencia múltiple, no podemos heredar la clase enum de ninguna otra clase, ya que la clase enum ya hereda de java.lang.Enum. Sin embargo, las clases enum pueden implementar interfaces en Java y esto se llama herencia Enum en Java.
A continuación se muestra un ejemplo de herencia Enum en Java.
|_+_|Producción:
Aquí tenemos una interfaz WeekDays con un prototipo de método abstracto displaydays (). Luego definimos una clase de enumeración Days que implementa la interfaz WeekDays. Aquí definimos valores de enumeración de DOMINGO a SÁBADO y también anulamos el método displaydays.
Finalmente, en el método principal, accedemos al valor de enumeración y lo mostramos.
Preguntas frecuentes
P # 1) ¿Qué sucede si le da un cuerpo de método en la interfaz?
Responder: Para las versiones de Java anteriores a Java 8, el cuerpo del método no está permitido en la interfaz. Pero desde Java 8, podemos definir métodos predeterminados o estáticos dentro de la interfaz.
P # 2) ¿Puede una interfaz tener variables en Java 8?
Responder: Podemos tener variables constantes en Java 8 usando modificadores estáticos y finales. Pero no podemos tener variables de instancia en interfaces Java. Cualquier intento de declarar variables de instancia en una interfaz resultará en un error del compilador.
P # 3) ¿Cuáles son las mejoras en las interfaces en Java 8?
Responder: La mejora más importante para las interfaces en Java 8 es que se permiten métodos estáticos y predeterminados en las interfaces. Podemos tener métodos declarados como estáticos o predeterminados y definirlos dentro de la interfaz.
P # 4) ¿Podemos anular el método predeterminado en la interfaz de Java?
Responder: No. No es obligatorio anular el método predeterminado en la interfaz. Esto se debe a que cuando implementamos una interfaz en una clase, el método predeterminado de la clase es accesible para la clase de implementación. Por lo tanto, utilizando el objeto de la clase de implementación, podemos acceder al método predeterminado de la interfaz.
P # 5) ¿Pueden las interfaces tener campos en Java?
¿Cuáles son dos técnicas comunes para obtener requisitos inicialmente?
Responder: Sí, podemos tener campos o variables en interfaces en Java pero por defecto, todos estos campos son estáticos, finales y públicos.
Conclusión
En este tutorial, hemos discutido los cambios realizados en las interfaces en Java 8. Java 8 introdujo métodos estáticos y predeterminados en las interfaces. Anteriormente, solo podíamos tener métodos abstractos en la interfaz. Pero desde Java 8 en adelante, podemos definir métodos predeterminados y estáticos en Java.
Además, Java 8 permite el uso de expresiones lambda con las interfaces funcionales en Java. Luego también discutimos clases e interfaces abstractas y vimos cuándo usar cada una de ellas en Java. También hemos visto la herencia enum en Java.
También discutimos algunas de las diferencias entre extensiones e implementos, clase e interfaz, clase abstracta e interfaz, etc.
=> Consulte TODOS los tutoriales de Java aquí.
Lectura recomendada
- Tutorial de interfaz Java y clase abstracta con ejemplos
- Interfaces comparables y comparativas en Java
- Interfaz ListIterator en Java con ejemplos
- Establecer interfaz en Java: Tutorial de conjunto de Java con ejemplos
- Interfaz de marcador en Java: serializable y clonable
- Método Java String length () con ejemplos
- Implementación de Java: creación y ejecución de un archivo JAR de Java
- ¿Cómo utilizar el método toString de Java?