English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java 8 ha introdotto i metodi di default dell'interfaccia.
In altre parole, i metodi di default sono metodi implementati dall'interfaccia, e non è necessario che la classe implementante li implementi.
Basta aggiungere la parola chiave default davanti al nome del metodo per implementare un metodo di default.
Perché avere questa caratteristica?
Prima di tutto, l'interfaccia precedente era un'arma a doppio taglio, con il vantaggio di essere orientata all'astrazione piuttosto che all'implementazione specifica, ma con il difetto che, quando c'è bisogno di modificare l'interfaccia, è necessario modificare tutte le classi che implementano quell'interfaccia. Il framework delle collezioni di Java 8 prima non aveva il metodo foreach, una soluzione tipica era aggiungere nuovi metodi e implementazioni alle interfacce JDK. Tuttavia, per le versioni già rilasciate, non è possibile aggiungere nuovi metodi all'interfaccia senza influenzare le implementazioni esistenti. Pertanto, è stata introdotta la funzionalità dei metodi di default. Lo scopo di questi metodi è risolvere il problema di incompatibilità tra la modifica dell'interfaccia e le implementazioni esistenti.
La sintassi del metodo di default è la seguente:
public interface Vehicle { default void print(){ System.out.println("Sono una macchina!"); {} {}
Un'interfaccia ha un metodo di default, consideriamo il caso in cui una classe implementi più interfacce e queste interfacce abbiano metodi di default identici, l'esempio seguente illustra come risolvere questa situazione:
public interface Vehicle { default void print(){ System.out.println("Sono una macchina!"); {} {} public interface FourWheeler { default void print(){ System.out.println("Sono una macchina a quattro ruote!"); {} {}
La prima soluzione è creare il proprio metodo di default per sovrascrivere il metodo di default dell'interfaccia:
public class Car implements Vehicle, FourWheeler { default void print(){ System.out.println("Sono una macchina a quattro ruote!"); {} {}
La seconda soluzione può utilizzare super per chiamare il metodo di default dell'interfaccia specificata:
public class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); {} {}
Un'altra caratteristica di Java 8 è che gli interfacce possono dichiarare (e fornire implementazioni) metodi statici. Ad esempio:
public interface Vehicle { default void print(){ System.out.println("Sono una macchina!"); {} // metodo statico static void blowHorn(){ System.out.println("Suona il clacson!!!"); {} {}
Possiamo comprendere l'uso dei metodi di default con il seguente codice, che possiamo inserire nel file Java8Tester.java:
public class Java8Tester { public static void main(String args[]){ Vehicle vehicle = new Car(); vehicle.print(); {} {} interfaccia Vehicle { default void print(){ System.out.println("Sono una macchina!"); {} static void blowHorn(){ System.out.println("Suona il clacson!!!"); {} {} interface FourWheeler { default void print(){ System.out.println("Sono una macchina a quattro ruote!"); {} {} class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("Sono una macchina!"); {} {}
Esegui lo script sopra, il risultato di output sarà:
$ javac Java8Tester.java $ java Java8Tester Sono una macchina! Sono una macchina a quattro ruote! Suona il clacson!!! Sono una macchina!