ProgrammatieMiddle/Senior Java ontwikkelaar

Wat is de class initialisatie volgorde in Java, hoe werkt het en wat kan er leiden tot een verkeerd begrip van de volgorde van initialisatie van statische en niet-statische leden?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

De initialisatievolgorde van een klasse in Java (class initialization order) bepaalt in welke volgorde velden, blokken en constructeurs worden geïnitialiseerd. Kort samengevat:

  1. Statische velden en statische initializers worden uitgevoerd in de volgorde waarin ze in de klasse verschijnen, wanneer de klasse wordt geladen door de JVM (een keer per klasse).
  2. Niet-statische velden en initializers worden uitgevoerd in de volgorde waarin ze verschijnen ELKE keer dat een instantie wordt gemaakt, vóór het aanroepen van de constructeur.
  3. De constructeur wordt uitgevoerd na de initialisatie van alle velden en blokken.

Voorbeeld

class Parent { static { System.out.println("Parent static"); } { System.out.println("Parent init"); } Parent() { System.out.println("Parent constructor"); } } class Child extends Parent { static { System.out.println("Child static"); } { System.out.println("Child init"); } Child() { System.out.println("Child constructor"); } } // new Child() -> wat is de volgorde?

De uitvoer zal zijn:

  1. Parent static
  2. Child static
  3. Parent init
  4. Parent constructor
  5. Child init
  6. Child constructor

Eerst de statische blokken van de ouders, dan de statische blokken van de kinderen, dan de niet-statische blokken en constructeurs in de volgorde van overerving.

Vragen met een addertje onder het gras.

Vraag: Wanneer zullen de statische initializers in de klasse worden uitgevoerd:

class Ex {
    static { System.out.println("static"); }
}

— bij het maken van het eerste exemplaar of bij de eerste toegang tot een statische methode/veld?

Antwoord: De statische initializer wordt uitgevoerd bij de eerste toegang tot de klasse, inclusief toegang tot elk statisch lid (methode/veld), en niet alleen bij het maken van een instantie.

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


Verhaal

In een bankapplicatie werd een statische verbindingspool geïnitialiseerd in een statisch blok, maar vanwege de aanroep van een statische methode vóór de creatie van de eerste instantie, was de verbinding nog niet gemaakt. Dit leidde tot een NullPointerException onder belasting.


Verhaal

De loggingdienst was afhankelijk van een niet-statisch veld dat werd geïnitialiseerd na de aanroep van de constructeur van de bovenliggende klasse. Logs werden geschreven naar een null-logger, waardoor belangrijke foutmeldingen verloren gingen.


Verhaal

Bij het toevoegen van een nieuw veld met een beginwaarde plaatste de ontwikkelaar het na de initialisatieblok: het blok probeerde een nog niet geïnitialiseerd veld te gebruiken, wat leidde tot fouten tijdens de opstart van de applicatie en een moeilijke zoektocht naar de oorzaak.