Metodi default nelle interfacce
Aggiungi implementazioni di metodi direttamente nelle interfacce, abilitando l'ereditarietà multipla del comportamento.
// Need abstract class to share behavior
public abstract class AbstractLogger {
public void log(String msg) {
System.out.println(
timestamp() + ": " + msg);
}
abstract String timestamp();
}
// Single inheritance only
public class FileLogger
extends AbstractLogger { ... }
public interface Logger {
default void log(String msg) {
IO.println(
timestamp() + ": " + msg);
}
String timestamp();
}
// Multiple interfaces allowed
public class FileLogger
implements Logger, Closeable { ... }
Ereditarietà multipla
Le classi possono implementare molte interfacce con metodi default, a differenza dell'ereditarietà da una singola classe astratta.
Evoluzione dell'API
Aggiungi nuovi metodi alle interfacce senza rompere le implementazioni esistenti.
Comportamento componibile
Mescola e abbina le capacità di più interfacce liberamente.
Disponibile dal JDK 8 (marzo 2014).
Prima di Java 8, condividere il comportamento tra classi non correlate richiedeva classi astratte, che limitavano all'ereditarietà singola. I metodi default permettono alle interfacce di fornire implementazioni di metodi, così le classi possono ereditare comportamento da più interfacce. Questo è stato essenziale per evolvere le API Collections (es. List.forEach, Map.getOrDefault) senza rompere le implementazioni esistenti.