Java 8 - Metodi predefiniti

Java 8 introduce un nuovo concetto di implementazione del metodo predefinito nelle interfacce. Questa funzionalità viene aggiunta per la compatibilità con le versioni precedenti in modo che le vecchie interfacce possano essere utilizzate per sfruttare la capacità di espressione lambda di Java 8.

Ad esempio, le interfacce "List" o "Collection" non hanno la dichiarazione del metodo "forEach". Pertanto, l'aggiunta di tale metodo interromperà semplicemente le implementazioni del framework di raccolta. Java 8 introduce il metodo predefinito in modo che l'interfaccia List / Collection possa avere un'implementazione predefinita del metodo forEach e la classe che implementa queste interfacce non deve implementare lo stesso.

Sintassi

public interface vehicle {

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

Default multipli

Con le funzioni predefinite nelle interfacce, esiste la possibilità che una classe stia implementando due interfacce con gli stessi metodi predefiniti. Il codice seguente spiega come risolvere questa ambiguità.

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 prima soluzione è creare un metodo personalizzato che sovrascriva l'implementazione predefinita.

public class car implements vehicle, fourWheeler {

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

La seconda soluzione è chiamare il metodo predefinito dell'interfaccia specificata utilizzando super.

public class car implements vehicle, fourWheeler {

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

Metodi predefiniti statici

Un'interfaccia può anche avere metodi di supporto statici da Java 8 in poi.

public interface vehicle {

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

Esempio di metodo predefinito

Crea il seguente programma Java utilizzando qualsiasi editor di tua scelta, ad esempio 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!");
   }
}

Verifica il risultato

Compila la classe usando javac compilatore come segue -

C:\JAVA>javac Java8Tester.java

Ora esegui Java8Tester come segue:

C:\JAVA>java Java8Tester

Dovrebbe produrre il seguente output:

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