In Java 8, le interfacce possono contenere metodi implementati, metodi statici e metodi cosiddetti "predefiniti" (che le classi di implementazione non hanno bisogno di sovrascrivere).
Dal mio punto di vista (probabilmente ingenuo), non era necessario violare interfacce come questa. Le interfacce sono sempre state un contratto che devi rispettare e questo è un concetto molto semplice e puro. Ora è un mix di diverse cose. Secondo me:
- i metodi statici non appartengono alle interfacce. Appartengono a classi di utilità.
- i metodi "predefiniti" non avrebbero dovuto essere ammessi 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 è possibile aggiungere un nuovo metodo in un'interfaccia senza modificare tutte le implementazioni, ma in realtà è una buona cosa.
Dopo Java 8:
- Non c'è praticamente alcuna differenza tra un'interfaccia e una classe astratta (oltre all'ereditarietà multipla). In effetti puoi emulare una classe normale con un'interfaccia.
- Durante la programmazione delle implementazioni, i programmatori potrebbero dimenticare di ignorare i metodi predefiniti.
- Si verifica 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 tenendo presente questa nuova funzionalità e ciò può causare problemi. Ad esempio, se qualcuno aggiunge un nuovo metodo predefinito
default void foo()
a un'interfacciaIx
, la classe cheCx
implementaIx
e che ha unfoo
metodo privato con la stessa firma non viene compilata.
Quali sono i motivi principali di tali importanti cambiamenti e quali nuovi vantaggi (se presenti) aggiungono?
@Deprecated
categoria! i metodi statici sono uno dei costrutti più abusati di Java, a causa dell'ignoranza e della pigrizia. Molti metodi statici di solito significano programmatore incompetente, aumentano l'accoppiamento di diversi ordini di grandezza e sono un incubo per unit test e refactor quando ti rendi conto del perché sono una cattiva idea!