Método predeterminado de interfaz en Java

Sheeraz Gul 12 octubre 2023
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:

  1. La clase abstracta puede definir constructores, mientras que el método predeterminado puede implementarse para invocar otras interfaces.
  2. 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:

  1. 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.
  2. 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.
  3. 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 Gul avatar Sheeraz Gul avatar

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

Artículo relacionado - Java Interface