Det "siste" nøkkelordet i Java

1. Oversikt

Mens arv gjør det mulig for oss å gjenbruke eksisterende kode, trenger vi noen ganger sette begrensninger på utvidbarhet av forskjellige grunner; de endelig nøkkelord lar oss gjøre akkurat det.

I denne opplæringen tar vi en titt på hva endelig søkeord betyr for klasser, metoder og variabler.

2. Endelig Klasser

Klasser merket som endelig kan ikke forlenges. Hvis vi ser på koden til Java-kjernebiblioteker, finner vi mange endelig klasser der. Et eksempel er String klasse.

Tenk på situasjonen hvis vi kan utvide String klasse, overstyre noen av metodene, og erstatte alle String forekomster med forekomster av vår spesifikke String underklasse.

Resultatet av operasjonene er over String gjenstander blir da uforutsigbare. Og gitt at String klasse brukes overalt, er det uakseptabelt. Det er derfor String klasse er merket som endelig.

Ethvert forsøk på å arve fra en endelig klasse vil forårsake en kompilatorfeil. For å demonstrere dette, la oss lage endelig klasse Katt:

offentlig sluttklasse Cat {privat int vekt; // standard getter og setter}

Og la oss prøve å utvide det:

offentlig klasse BlackCat utvider Cat {}

Vi får se kompilatorfeilen:

Typen BlackCat kan ikke underklasse den endelige klassen Cat

Noter det de endelig nøkkelord i en klassedeklarasjon betyr ikke at objektene i denne klassen er uforanderlige. Vi kan endre felt av Katt innvende fritt:

Kattkatt = ny katt (); cat.setWeight (1); assertEquals (1, cat.getWeight ()); 

Vi kan bare ikke utvide det.

Hvis vi følger reglene for god design strengt, bør vi opprette og dokumentere en klasse nøye eller erklære den endelig av sikkerhetsmessige årsaker. Vi bør imidlertid være forsiktige når vi lager endelig klasser.

Legg merke til at det å lage en klasse endelig betyr at ingen andre programmerere kan forbedre det. Tenk deg at vi bruker en klasse og ikke har kildekoden til den, og det er et problem med en metode.

Hvis klassen er det endelig, vi kan ikke utvide den for å overstyre metoden og løse problemet. Med andre ord, vi mister utvidbarhet, en av fordelene med objektorientert programmering.

3. Endelig Metoder

Metoder merket som endelig kan ikke overstyres. Når vi designer en klasse og føler at en metode ikke skal overstyres, kan vi lage denne metoden endelig. Vi kan også finne mange endelig metoder i Java kjernebiblioteker.

Noen ganger trenger vi ikke å forby en klasseutvidelse helt, men bare forhindre at noen metoder overstyres. Et godt eksempel på dette er Tråd klasse. Det er lovlig å utvide den og dermed opprette en tilpasset trådklasse. Men det er er i live() metoder er endelig.

Denne metoden sjekker om en tråd er i live. Det er umulig å overstyre er i live() metoden riktig av mange grunner. En av dem er at denne metoden er innfødt. Innfødt kode er implementert på et annet programmeringsspråk og er ofte spesifikt for operativsystemet og maskinvaren det kjører på.

La oss lage en Hund klasse og lage sin lyd() metode endelig:

public class Dog {public final void sound () {// ...}}

La oss nå utvide Hund klasse og prøv å overstyre dens lyd() metode:

offentlig klasse BlackDog utvider Dog {public void sound () {}}

Vi får se kompilatorfeilen:

- tilsidesetter com.baeldung.finalkeyword.Dog.sound - Kan ikke overstyre den endelige metoden fra Dog sound () -metoden er endelig og kan ikke overstyres

Hvis noen metoder i klassen vår blir kalt av andre metoder, bør vi vurdere å lage de kallte metodene endelig. Ellers kan overstyring påvirke innringernes arbeid og føre til overraskende resultater.

Hvis konstruktøren vår kaller andre metoder, bør vi generelt erklære disse metodene endelig av ovennevnte grunn.

Hva er forskjellen mellom å lage alle metodene i klassen endelig og markering av selve klassen endelig? I det første tilfellet kan vi utvide klassen og legge til nye metoder for den.

I det andre tilfellet kan vi ikke gjøre dette.

4. Endelig Variabler

Variabler merket som endelig kan ikke tildeles på nytt. En gang en endelig variabelen er initialisert, den kan ikke endres.

4.1. Endelig Primitive variabler

La oss erklære en primitiv endelig variabel Jeg, tilordne deretter 1 til den.

Og la oss prøve å tilordne verdien 2 til den:

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

Kompilatoren sier:

Den endelige lokale variabelen i kan allerede ha blitt tildelt

4.2. Endelig Referansevariabler

Hvis vi har en endelig referansevariabelen, kan vi heller ikke tildele den på nytt. Men dette betyr ikke at objektet det refererer til er uforanderlig. Vi kan endre egenskapene til dette objektet fritt.

For å demonstrere dette, la oss erklære endelig referansevariabel katt og initialiser den:

endelig kattkatt = ny katt ();

Hvis vi prøver å tildele den på nytt, ser vi en kompilatorfeil:

Den endelige lokale variabelen katten kan ikke tildeles. Den må være blank og ikke bruke en sammensatt oppgave

Men vi kan endre egenskapene til Katt forekomst:

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

4.3. Endelig Enger

Endelig felt kan enten være konstanter eller skrive én gang-felt. For å skille dem ut, bør vi stille et spørsmål - ville vi inkludere dette feltet hvis vi skulle serieisere objektet? Hvis nei, er det ikke en del av objektet, men en konstant.

Merk at i henhold til navngivningskonvensjoner skal klassekonstanter være store, med komponenter atskilt med understrekingstegn (“_”):

statisk sluttint MAX_WIDTH = 999;

Noter det noen endelig feltet må initialiseres før konstruktøren er ferdig.

Til statisk finale felt, betyr dette at vi kan initialisere dem:

  • ved erklæring som vist i eksemplet ovenfor
  • i den statiske initialiseringsblokken

For eksempel endelig felt, betyr dette at vi kan initialisere dem:

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

Ellers vil kompilatoren gi oss en feil.

4.4. Endelig Argumenter

De endelig nøkkelord er også lovlig å sette før metode argumenter. EN endelig argument kan ikke endres i en metode:

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

Ovennevnte oppgave forårsaker kompilatorfeilen:

Den endelige lokale variabelen x kan ikke tildeles. Den må være blank og ikke bruke en sammensatt oppgave

5. Konklusjon

I denne artikkelen lærte vi hva endelig søkeord betyr for klasser, metoder og variabler. Selv om vi kanskje ikke bruker endelig nøkkelord ofte i vår interne kode, kan det være en god designløsning.

Som alltid kan den fullstendige koden for denne artikkelen finnes i GitHub-prosjektet.