Det "sidste" nøgleord i Java

1. Oversigt

Mens arv gør det muligt for os at genbruge eksisterende kode, er vi undertiden nødt til det sæt begrænsninger for udvidelighed af forskellige årsager det endelig nøgleord giver os mulighed for at gøre netop det.

I denne tutorial tager vi et kig på, hvad endelig nøgleord betyder for klasser, metoder og variabler.

2. Endelig Klasser

Klasser markeret som endelig kan ikke forlænges. Hvis vi ser på koden til Java-kernebiblioteker, finder vi mange endelig klasser der. Et eksempel er Snor klasse.

Overvej situationen, hvis vi kan udvide Snor klasse, tilsidesætte en af ​​dens metoder og erstatte alle Snor forekomster med forekomsterne af vores specifikke Snor underklasse.

Resultatet af operationerne er overstået Snor objekter bliver så uforudsigelige. Og i betragtning af at Snor klasse bruges overalt, det er uacceptabelt. Det er derfor Snor klasse er markeret som endelig.

Ethvert forsøg på at arve fra en endelig klasse vil forårsage en kompilatorfejl. For at demonstrere dette skal vi oprette endelig klasse Kat:

offentlig endelig klasse Cat {privat int vægt; // standard getter og setter}

Og lad os prøve at udvide det:

offentlig klasse BlackCat udvider Cat {}

Vi får vist compilerfejlen:

Typen BlackCat kan ikke underklasse den endelige klasse Cat

Noter det det endelig nøgleord i en klassedeklaration betyder ikke, at objekterne i denne klasse er uforanderlige. Vi kan ændre felterne i Kat objekt frit:

Katkat = ny kat (); cat.setWeight (1); assertEquals (1, cat.getWeight ()); 

Vi kan bare ikke udvide det.

Hvis vi følger reglerne for godt design nøje, skal vi oprette og dokumentere en klasse omhyggeligt eller erklære det endelig af sikkerhedsmæssige årsager. Vi skal dog være forsigtige, når vi opretter endelig klasser.

Bemærk at lave en klasse endelig betyder, at ingen andre programmerere kan forbedre det. Forestil dig, at vi bruger en klasse og ikke har kildekoden til den, og der er et problem med en metode.

Hvis klassen er det endelig, vi kan ikke udvide det til at tilsidesætte metoden og løse problemet. Med andre ord mister vi udvidelsen, en af ​​fordelene ved objektorienteret programmering.

3. Endelig Metoder

Metoder markeret som endelig kan ikke tilsidesættes. Når vi designer en klasse og føler, at en metode ikke bør tilsidesættes, kan vi lave denne metode endelig. Vi kan også finde mange endelig metoder i Java-kernebiblioteker.

Nogle gange behøver vi ikke helt at forbyde en klasseudvidelse, men kun forhindre tilsidesættelse af nogle metoder. Et godt eksempel på dette er Tråd klasse. Det er lovligt at udvide det og dermed oprette en brugerdefineret trådklasse. Men det er er i live() metoder er endelig.

Denne metode kontrollerer, om en tråd er i live. Det er umuligt at tilsidesætte er i live() metode korrekt af mange grunde. En af dem er, at denne metode er hjemmehørende. Native kode er implementeret på et andet programmeringssprog og er ofte specifik for operativsystemet og den hardware, det kører på.

Lad os oprette en Hund klasse og lave sin lyd() metode endelig:

offentlig klasse Hund {offentlig endelig ugyldig lyd () {// ...}}

Lad os nu udvide Hund klasse og prøv at tilsidesætte dens lyd() metode:

offentlig klasse BlackDog udvider Hund {offentlig ugyldig lyd () {}}

Vi får vist compilerfejlen:

- tilsidesætter com.baeldung.finalkeyword.Dog.sound - Kan ikke tilsidesætte den endelige metode fra Dog sound () -metoden er endelig og kan ikke tilsidesættes

Hvis nogle metoder i vores klasse kaldes med andre metoder, bør vi overveje at lave de kaldte metoder endelig. Ellers kan tilsidesættelse af dem påvirke opkalders arbejde og forårsage overraskende resultater.

Hvis vores konstruktør kalder andre metoder, skal vi generelt erklære disse metoder endelig af ovenstående grund.

Hvad er forskellen mellem at lave alle klassens metoder endelig og markering af selve klassen endelig? I det første tilfælde kan vi udvide klassen og tilføje nye metoder til den.

I det andet tilfælde kan vi ikke gøre dette.

4. Endelig Variabler

Variabler markeret som endelig kan ikke omfordeles. Engang en endelig variabel er initialiseret, den kan ikke ændres.

4.1. Endelig Primitive variabler

Lad os erklære en primitiv endelig variabel jeg, tildel derefter 1 til den.

Og lad os prøve at tildele en værdi på 2 til den:

offentlig ugyldig nårFinalVariableAssign_thenOnlyOnce () {final int i = 1; // ... i = 2; }

Kompilatoren siger:

Den endelige lokale variabel i er muligvis allerede tildelt

4.2. Endelig Referencevariabler

Hvis vi har en endelig referencevariabel, kan vi heller ikke omfordele den. Men dette betyder ikke, at det objekt, det refererer til, er uforanderligt. Vi kan ændre egenskaberne for dette objekt frit.

For at demonstrere dette, lad os erklære endelig referencevariabel kat og initialiser det:

endelig katkat = ny kat ();

Hvis vi forsøger at omfordele det, ser vi en compiler-fejl:

Den endelige lokale variable kat kan ikke tildeles. Det skal være tomt og ikke bruge en sammensat opgave

Men vi kan ændre egenskaberne for Kat eksempel:

cat.setWeight (5); assertEquals (5, cat.getWeight ());

4.3. Endelig Felter

Endelig felter kan enten være konstanter eller skrive én gang-felter. For at skelne mellem dem skal vi stille et spørgsmål - ville vi medtage dette felt, hvis vi serierede objektet? Hvis nej, er det ikke en del af objektet, men en konstant.

Bemærk, at i henhold til navngivningskonventioner skal klassekonstanter være store bogstaver med komponenter adskilt med understregningstegn (“_”):

statisk endelig int MAX_WIDTH = 999;

Noter det nogen endelig feltet skal initialiseres, før konstruktøren er færdig.

Til statisk endelig felter, betyder det, at vi kan initialisere dem:

  • ved erklæring som vist i ovenstående eksempel
  • i den statiske initialiseringsblok

For eksempel endelig felter, betyder det, at vi kan initialisere dem:

  • efter erklæring
  • i initialiseringsblokken
  • i konstruktøren

Ellers giver compileren os en fejl.

4.4. Endelig Argumenter

Det endelig nøgleord er også lovligt at sætte før metode argumenter. EN endelig argument kan ikke ændres i en metode:

public void methodWithFinalArguments (final int x) {x = 1; }

Ovenstående opgave forårsager compilerfejlen:

Den endelige lokale variabel x kan ikke tildeles. Det skal være tomt og ikke bruge en sammensat opgave

5. Konklusion

I denne artikel lærte vi, hvad endelig nøgleord betyder for klasser, metoder og variabler. Selvom vi muligvis ikke bruger endelig nøgleord ofte i vores interne kode, kan det være en god designløsning.

Som altid kan den komplette kode til denne artikel findes i GitHub-projektet.


$config[zx-auto] not found$config[zx-overlay] not found