Método predeterminado de interfaz en Java
Este tutorial demuestra cómo utilizar el método predeterminado
en la interfaz de Java.
Método predeterminado de interfaz en Java
Los métodos predeterminados
se introdujeron en Java 8 antes de que las interfaces solo tuvieran métodos abstractos. Los métodos predeterminados
o defensores permiten al desarrollador agregar nuevos métodos a la interfaz sin romper la implementación.
El método predeterminado
proporciona la flexibilidad para permitir que la interfaz defina la implementación. Esta implementación se considerará predeterminada en esta situación en la que una clase no pudo proporcionar la implementación de ese método.
Intentemos crear una interfaz con un método predeterminado
:
package delftstack;
public interface Demo_Interface {
public void Existing_Method();
default public void Default_Method() {
System.out.println("a default method is added to the interface");
}
}
El código anterior agrega un método predeterminado
a la interfaz. Probemos con otro ejemplo que muestra cómo funcionan los métodos predeterminados
:
package delftstack;
interface Demo_Interface {
// The abstract method
public void cube(int x);
// The default method
default void show() {
System.out.println("Default Method is Executed");
}
}
public class Example implements Demo_Interface {
// The implementation of an abstract method
public void cube(int x) {
System.out.println(x * x * x);
}
public static void main(String args[]) {
Example Demo = new Example();
Demo.cube(6);
// execute default method.
Demo.show();
}
}
El código anterior crea un método abstracto para calcular el cubo de un número entero y un método predeterminado
para mostrar el resultado. Ver la salida:
216
Default Method is Executed
Métodos predeterminados frente a clases abstractas
Los métodos predeterminados en las interfaces y las clases abstractas se comportan de la misma manera, pero tienen algunas diferencias:
- La clase abstracta puede definir constructores, mientras que el método
predeterminado
puede implementarse para invocar otras interfaces. - La clase abstracta está más estructurada y se les pueden asociar estados. Al mismo tiempo, los métodos “predeterminados” no hacen referencia al estado de una implementación en particular.
Métodos predeterminados frente a métodos regulares
El método predeterminado es diferente del método normal. Las principales diferencias son:
- Los métodos regulares en las clases pueden modificar los argumentos del método y los campos de la clase. Por el contrario, los métodos
predeterminados
solo pueden acceder a sus propios argumentos porque la interfaz no tiene ningún estado. - Los métodos regulares necesitan romper la implementación para agregar una nueva funcionalidad a la clase, mientras que los métodos “predeterminados” pueden agregar una nueva funcionalidad a la interfaz sin romper la implementación.
- Podemos volver a declarar los métodos
predeterminados
como métodos abstractos, obligando a la subclase a anularlos.
Métodos predeterminados y herencia múltiple
Como sabemos, las herencias múltiples solo son posibles a través de interfaces en Java. Ahora, la clase Java puede tener múltiples interfaces, y cada interfaz puede definir un método “predeterminado” con la misma firma de método, creando un conflicto entre los métodos heredados.
Ver ejemplo:
package delftstack;
interface Interface_One {
default void defaultMethod() {
System.out.println("Interface One default method");
}
}
interface Interface_Two {
default void defaultMethod() {
System.out.println("Interface Two default method");
}
}
public class Example implements Interface_One, Interface_Two {}
El código anterior tendrá un error de compilación. Ver la salida:
java: class Example inherits unrelated defaults for defaultMethod() from types Interface_One and Interface_Two
Hay una solución simple a este error; necesitamos proporcionar una implementación de método predeterminada
en la clase Ejemplo
. Ver ejemplo:
package delftstack;
interface Interface_One {
default void defaultMethod() {
System.out.println("Interface One default method");
}
}
interface Interface_Two {
default void defaultMethod() {
System.out.println("Interface Two default method");
}
}
public class Example implements Interface_One, Interface_Two {
public void defaultMethod() {}
}
Esto solucionará el problema. Además, si desea invocar el método predeterminado
desde la superinterfaz en la clase, puede usar esto:
package delftstack;
interface Interface_One {
default void defaultMethod() {
System.out.println("Interface One default method");
}
}
interface Interface_Two {
default void defaultMethod() {
System.out.println("Interface Two default method");
}
}
public class Example implements Interface_One, Interface_Two {
public void defaultMethod() {
// other code
Interface_One.super.defaultMethod();
}
}
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
LinkedIn Facebook