In Java 8 werd het concept van default methods geïntroduceerd - dit zijn methoden met implementatie die binnen een interface zijn gedeclareerd. Ze maken het mogelijk om nieuwe methoden aan interfaces toe te voegen, zonder de compatibiliteit met bestaande implementaties te verstoren.
Syntax:
public interface MyInterface { default void printHello() { System.out.println("Hello!"); } }
Kenmerken en nuances:
Object (bijvoorbeeld equals, hashCode) overschrijven.Wat gebeurt er als een klasse twee interfaces met dezelfde default-methode implementeert en deze methode niet overschrijft?
Antwoord: De compiler geeft een foutmelding "class... inherits unrelated defaults for ... from types ... and ...", en het is noodzakelijk om deze methode expliciet in de klasse te implementeren.
Voorbeeld:
interface A { default void doSomething() { System.out.println("A"); } } interface B { default void doSomething() { System.out.println("B"); } } class C implements A, B {} // Compileerfout!
Oplossing:
class C implements A, B { @Override public void doSomething() { A.super.doSomething(); // of B.super.doSomething() } }
Verhaal
In een teamproject voor de migratie van de API werd een default-methode aan de gemeenschappelijke interface toegevoegd. Oude implementaties van de interface overschreven de nieuwe methode niet, wat leidde tot onverwacht gedrag, aangezien de standaardimplementatie werd uitgevoerd in plaats van de verwachte logica. Als gevolg hiervan merkten gebruikers een verlies van functionaliteit op.
Verhaal
Bij het uitbreiden van de bibliotheek voegde een van de ontwikkelaars een default-methode met bedrijfslogica toe aan de gemeenschappelijke interface. Het daaropvolgende toevoegen van een soortgelijke methode met ander gedrag in een andere interface veroorzaakte een conflict in de overerving, wat het compileren van nieuwe implementaties verhinderde.
Verhaal
Een ontwikkelaar probeerde een default-methode met de naam
hashCodete gebruiken in de interface, in de verwachting dat dit invloed zou hebben op het overschrijven van de methode in de afgeleide klassen, maar de compiler stond dit niet toe. Dit leidde tot een langdurige zoektocht naar de oorzaak van de fout en een herstructurering van de interfaces.