In Java 8 è stata introdotta la nozione di default methods — questi sono metodi con implementazione dichiarati all'interno di un'interfaccia. Consentono di aggiungere nuovi metodi alle interfacce senza compromettere la compatibilità con le implementazioni esistenti.
Sintassi:
public interface MyInterface { default void printHello() { System.out.println("Hello!"); } }
Caratteristiche e dettagli:
Object (ad esempio, equals, hashCode).Cosa succede se una classe implementa due interfacce con lo stesso metodo di default e non sovrascrive questo metodo?
Risposta: Il compilatore genererà un errore "class... inherits unrelated defaults for ... from types ... and ...", e sarà necessario implementare esplicitamente questo metodo nella classe.
Esempio:
interface A { default void doSomething() { System.out.println("A"); } } interface B { default void doSomething() { System.out.println("B"); } } class C implements A, B {} // Errore di compilazione!
Soluzione:
class C implements A, B { @Override public void doSomething() { A.super.doSomething(); // o B.super.doSomething() } }
Storia
In un progetto di squadra per la migrazione dell'API è stato aggiunto un metodo di default nell'interfaccia comune. Le vecchie implementazioni dell'interfaccia non hanno sovrascritto il nuovo metodo, il che ha portato a comportamenti inaspettati poiché veniva eseguita l'implementazione di default invece della logica prevista. Di conseguenza, gli utenti hanno notato una caduta nella funzionalità.
Storia
Durante l'estensione di una libreria, uno degli sviluppatori ha aggiunto un metodo di default con logica di business nell'interfaccia comune. L'aggiunta successiva di un metodo simile con comportamento diverso in un'altra interfaccia ha causato un conflitto di eredità, impedendo di compilare le nuove implementazioni.
Storia
Uno sviluppatore ha cercato di utilizzare un metodo di default con nome
hashCodenell'interfaccia, sperando che questo influisse sulla sovrascrittura del metodo nelle classi derivate, ma il compilatore ha impedito di farlo. Ciò ha portato a una lunga indagine sulle cause dell'errore e a una ristrutturazione della struttura delle interfacce.