I metodi statici nelle interfacce sono stati introdotti a partire da Java 8. Vengono dichiarati con la parola chiave static e vengono implementati direttamente nell'interfaccia. I metodi statici non sono ereditati dalle classi che li implementano e vengono chiamati tramite il nome dell'interfaccia.
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);Domanda: Può un metodo statico di un'interfaccia essere chiamato tramite un oggetto della classe che lo implementa?
Risposta: No, il metodo statico di un'interfaccia deve sempre essere chiamato tramite il nome dell'interfaccia e non tramite un'istanza o il nome della classe di implementazione. Questo esempio genererà un errore di compilazione:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // Errore! Bisogna usare MathUtils.sum(1, 2)
Storia
Gli sviluppatori erroneamente cercavano di "sovrascrivere" un metodo statico dell'interfaccia nella classe implementante e si aspettavano di chiamare quel metodo tramite un'istanza. Alla fine, veniva sempre chiamata la versione dell'interfaccia, il che portava a una logica aziendale errata durante l'utilizzo.
Storia
Durante la migrazione dei metodi utilitari da una classe a un'interfaccia, una parte del codice usava la chiamata tramite oggetto:
obj.method(), il che divenne impossibile, costringendo a rifattorizzare le chiamate inInterfaceName.method()in tutto il progetto.
Storia
Il supporto per le versioni precedenti di Java ha portato a errori di compilazione dopo che sono stati aggiunti metodi statici nelle interfacce; gli sviluppatori non hanno controllato quale versione del compilatore fosse in uso nel CI, e il build ha cominciato a fallire regolarmente.