ProgrammatieJava ontwikkelaar

Hoe werkt de final-methode in Java - voor variabelen, methoden en klassen, en welke onverwachte effecten kan verkeerd gebruik van deze modifier veroorzaken?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

final in Java wordt gebruikt voor:

  • Variabelen - wordt niet-wijzigbaar na initialisatie;
  • Methoden - kunnen niet worden overschreven in afgeleiden klassen;
  • Klassen - kunnen geen afgeleiden klassen maken.

Eigenschappen en nuances:

  • Een final variabele moet worden geïnitialiseerd bij declaratie of in de constructor;
  • Een final referentie staat niet toe dat de referentie wordt gewijzigd, maar het object waar het naar verwijst kan worden gewijzigd (als het niet immutable is!);
  • Erfenis van een final klasse (bijvoorbeeld String, Math) is onmogelijk;
  • Een final methode kan niet worden overschreven, zelfs niet als de klasse erfelijk is.
final class A {} // kan geen class B extends A maken class Parent { final void foo() { } } class Child extends Parent { // void foo() {} // fout: kan foo niet retourneren } final int COUNT = 10;

Vragenn met een twist.

Kan de toestand van het object waarvan de final variabele verwijst worden gewijzigd?

Antwoord: Ja, als het geen immutable-object is. Bijvoorbeeld:

final List<String> names = new ArrayList<>(); names.add("Vasya"); // Dit is toegestaan - het object waarnaar wordt verwezen verandert, maar de referentie zelf niet names = new ArrayList<>(); // Compilatiefout

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp.


Verhaal

In het logsysteem werd de enige final Logger overal in de code doorgegeven, in de veronderstelling dat het object volledig beveiligd was - maar ze veranderden de instellingen via een openbare methode, wat de configuratie wereldwijd verstoorde.

Verhaal

In de utility-klasse maakten ze final velden van het type List, en probeerden toen deze naar buiten te retourneren voor algemeen gebruik. De externe code wijzigde moeiteloos de inhoud van de lijst via de verkregen referentie - final biedt daar geen bescherming tegen.

Verhaal

Er kwam een vraag om de externe API, gebouwd op final klassen, uit te breiden. Door hen bleek het onmogelijk om uit te breiden, en moesten ze de logica dupliceren en twee onafhankelijke productvertakkingen onderhouden, wat de migraties bemoeilijkte.