ProgrammatieJava ontwikkelaar

Wat zijn interfaces met standaardmethoden (default methods) in Java, en wat zijn de nuances van hun gebruik?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

  • Als een klasse twee interfaces implementeert met dezelfde handtekening voor de default-methode, ontstaat er een conflict, en de klasse is verplicht om deze methode te overschrijven.
  • Default-methoden kunnen geen methods van de klasse Object (bijvoorbeeld equals, hashCode) overschrijven.
  • In interfaces kunnen ook statische methoden worden gedeclareerd.

Vraag met een addertje onder het gras.

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

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp.


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 hashCode te 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.