Java 8: métodos predeterminados

Java 8 introduce un nuevo concepto de implementación de métodos predeterminados en interfaces. Esta capacidad se agrega para compatibilidad con versiones anteriores, de modo que las interfaces antiguas se puedan usar para aprovechar la capacidad de expresión lambda de Java 8.

Por ejemplo, las interfaces 'Lista' o 'Colección' no tienen la declaración de método 'forEach'. Por lo tanto, agregar dicho método simplemente romperá las implementaciones del marco de recopilación. Java 8 introduce el método predeterminado para que la interfaz List / Collection pueda tener una implementación predeterminada del método forEach, y la clase que implementa estas interfaces no necesita implementar lo mismo.

Sintaxis

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

Varios valores predeterminados

Con funciones predeterminadas en interfaces, existe la posibilidad de que una clase esté implementando dos interfaces con los mismos métodos predeterminados. El siguiente código explica cómo se puede resolver esta ambigüedad.

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

public interface fourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

La primera solución es crear un método propio que anule la implementación predeterminada.

public class car implements vehicle, fourWheeler {

   public void print() {
      System.out.println("I am a four wheeler car vehicle!");
   }
}

La segunda solución es llamar al método predeterminado de la interfaz especificada usando super.

public class car implements vehicle, fourWheeler {

   public void print() {
      vehicle.super.print();
   }
}

Métodos estáticos predeterminados

Una interfaz también puede tener métodos auxiliares estáticos desde Java 8 en adelante.

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

Ejemplo de método predeterminado

Cree el siguiente programa Java usando cualquier editor de su elección en, digamos, C: \> JAVA.

Java8Tester.java

public class Java8Tester {

   public static void main(String args[]) {
      Vehicle vehicle = new Car();
      vehicle.print();
   }
}

interface Vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

interface FourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {

   public void print() {
      Vehicle.super.print();
      FourWheeler.super.print();
      Vehicle.blowHorn();
      System.out.println("I am a car!");
   }
}

Verificar el resultado

Compila la clase usando javac compilador de la siguiente manera:

C:\JAVA>javac Java8Tester.java

Ahora ejecute Java8Tester de la siguiente manera:

C:\JAVA>java Java8Tester

Debería producir el siguiente resultado:

I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!