Domyślne metody interfejsów
Dodaj implementacje metod bezpośrednio w interfejsach, umożliwiając wielokrotne dziedziczenie zachowania.
// 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 { ... }
Wielokrotne dziedziczenie
Klasy mogą implementować wiele interfejsów z metodami domyślnymi, w odróżnieniu od pojedynczego dziedziczenia klas abstrakcyjnych.
Ewolucja API
Dodawaj nowe metody do interfejsów bez łamania istniejących implementacji.
Komponowalne zachowanie
Swobodnie łącz i dobieraj możliwości z wielu interfejsów.
Szeroko dostępne od JDK 8 (marzec 2014)
Przed Javą 8 współdzielenie zachowania między niezwiązanymi klasami wymagało klas abstrakcyjnych, co ograniczało do pojedynczego dziedziczenia. Metody domyślne pozwalają interfejsom dostarczać implementacje metod, dzięki czemu klasy mogą dziedziczyć zachowanie z wielu interfejsów. Było to niezbędne do rozszerzenia API Collections (np. List.forEach, Map.getOrDefault) bez łamania istniejących implementacji.