Statische methoden in interfaces zijn geïntroduceerd vanaf Java 8. Ze worden gedeclareerd met het sleutelwoord static en worden direct in de interface geïmplementeerd. Statische methoden worden niet geërfd door implementerende klassen, maar worden aangeroepen via de naam van de interface.
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);Vraag: Kan een statische methode van een interface worden aangeroepen via een object van de implementerende klasse?
Antwoord: Nee, een statische methode van een interface wordt altijd aangeroepen via de naam van de interface, en niet via een instantie of de naam van de implementerende klasse. Dit voorbeeld zal een compilatiefout veroorzaken:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // Fout! Het moet MathUtils.sum(1, 2) zijn
Verhaal
Ontwikkelaars probeerden ten onrechte een statische methode van een interface te "overschrijven" in de implementerende klasse en verwachtten deze methode via een instantie aan te roepen. Uiteindelijk werd altijd de versie uit de interface aangeroepen, wat leidde tot onjuiste bedrijfslogica tijdens het gebruik.
Verhaal
Bij het migreren van utilitaire methoden van een klasse naar een interface gebruikte een deel van de code de aanroep via een object:
obj.method(), wat onmogelijk werd, zodat het nodig was om de aanroepen in het hele project te refactoren naarInterfaceName.method().
Verhaal
Ondersteuning voor oudere versies van Java leidde tot compilatiefouten na het toevoegen van statische methoden aan interfaces, omdat ontwikkelaars niet controleerde welke versie van de compiler werd gebruikt in CI, waardoor de build regelmatig faalde.