ProgrammazioneSviluppatore Java

Cosa sono le interfacce con metodi di default (default methods) in Java e quali sono le sfumature del loro utilizzo?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Se una classe implementa due interfacce con la stessa firma del metodo di default, si verifica un conflitto e la classe è obbligata a sovrascrivere questo metodo.
  • I metodi di default non possono sovrascrivere i metodi della classe Object (ad esempio, equals, hashCode).
  • Negli interfacce possono anche essere dichiarati metodi statici.

Domanda trabocchetto.

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() } }

Esempi di errori reali a causa dell'ignoranza delle sfumature del tema.


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 hashCode nell'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.