In Java 8, le interfacce possono contenere metodi implementati, metodi statici e i cosiddetti metodi "predefiniti" (che le classi di implementazione non devono sovrascrivere).
Nella mia (probabilmente ingenua) visione, non c'era bisogno di violare interfacce come questa. Le interfacce sono sempre state un contratto da soddisfare, e questo è un concetto molto semplice e puro. Ora è un mix di diverse cose. A mio parere:
-
I
- metodi statici non appartengono alle interfacce. Appartengono a classi di utilità.
- I metodi "predefiniti" non dovrebbero essere permessi nelle interfacce. Puoi sempre usare una classe astratta per questo scopo.
In breve:
Prima di Java 8:
- È possibile utilizzare classi astratte e regolari per fornire metodi statici e predefiniti. Il ruolo delle interfacce è chiaro.
- Tutti i metodi in un'interfaccia dovrebbero essere sostituiti implementando le classi.
- Non puoi aggiungere un nuovo metodo in un'interfaccia senza modificare tutte le implementazioni, ma questa è effettivamente una buona cosa.
Dopo Java 8:
- Non c'è praticamente alcuna differenza tra un'interfaccia e una classe astratta (diversa dall'ereditarietà multipla). In effetti puoi emulare una classe regolare con un'interfaccia.
- Durante la programmazione delle implementazioni, i programmatori potrebbero dimenticare di sovrascrivere i metodi predefiniti.
- C'è un errore di compilazione se una classe tenta di implementare due o più interfacce con un metodo predefinito con la stessa firma.
- Aggiungendo un metodo predefinito a un'interfaccia, ogni classe di implementazione eredita automaticamente questo comportamento. Alcune di queste classi potrebbero non essere state progettate pensando a questa nuova funzionalità e questo può causare problemi. Ad esempio, se qualcuno aggiunge un nuovo metodo predefinito
default void foo()
a un'interfacciaIx
, la classeCx
che implementaIx
e un metodo privatofoo
con la stessa firma non viene compilata.
Quali sono le ragioni principali di tali grandi cambiamenti e quali nuovi vantaggi (se esistono) aggiungono?