"Posljednja" ključna riječ u Javi

1. Pregled

Iako nam nasljeđivanje omogućuje ponovnu upotrebu postojećeg koda, ponekad to i trebamo postaviti ograničenja na proširivost iz raznih razloga; the konačni ključna riječ omogućuje nam upravo to.

U ovom uputstvu ćemo pogledati što konačni ključna riječ znači za klase, metode i varijable.

2. Konačno Nastava

Predmeti označeni kao konačni ne može se produžiti. Ako pogledamo kod Java osnovnih knjižnica, naći ćemo ih mnogo konačni predavanja tamo. Jedan od primjera je Niz razred.

Razmotrimo situaciju ako možemo proširiti Niz klase, nadjačati bilo koju od njezinih metoda i zamijeniti sve Niz instance s primjerima naših specifičnih Niz podrazred.

Rezultat operacija preko Niz predmeti će tada postati nepredvidljivi. A s obzirom na to da Niz razred se koristi svugdje, to je neprihvatljivo. Zato je Niz razred je označen kao konačni.

Svaki pokušaj nasljeđivanja od konačni klasa će uzrokovati pogrešku kompajlera. Da bismo to demonstrirali, stvorimo konačni razred Mačka:

javna završna klasa Cat {private int weight; // standardni geter i postavljač}

I pokušajmo ga proširiti:

javna klasa BlackCat proširuje Cat {}

Vidjet ćemo pogrešku kompajlera:

Tip BlackCat ne može podrazvrstati konačnu klasu Cat

Imajte na umu da the konačni Ključna riječ u deklaraciji klase ne znači da su objekti ove klase nepromjenjivi. Možemo mijenjati polja Mačka slobodno prigovarati:

Mačka mačka = nova Mačka (); cat.setWeight (1); assertEquals (1, cat.getWeight ()); 

Jednostavno ga ne možemo produžiti.

Ako se strogo pridržavamo pravila dobrog dizajna, trebali bismo pažljivo stvoriti i dokumentirati razred ili ga prijaviti konačni iz sigurnosnih razloga. Međutim, pri stvaranju bismo trebali biti oprezni konačni razreda.

Primijetite da izrada predavanja konačni znači da ga niti jedan drugi programer ne može poboljšati. Zamislite da koristimo klasu i nemamo izvorni kôd za nju, a postoji problem s jednom metodom.

Ako je razred konačni, ne možemo ga proširiti kako bi nadjačali metodu i riješili problem. Drugim riječima, gubimo proširivost, jednu od blagodati objektno orijentiranog programiranja.

3. Konačno Metode

Metode označene kao konačni ne može se nadjačati. Kada dizajniramo klasu i smatramo da metodu ne treba nadjačati, možemo je napraviti konačni. Možemo ih naći i mnoge konačni metode u osnovnim knjižnicama Java.

Ponekad ne trebamo u potpunosti zabraniti proširenje razreda, već samo sprječavamo nadjačavanje nekih metoda. Dobar primjer za to je Nit razred. Legalno je proširiti ga i tako stvoriti prilagođenu klasu niti. Ali to je živ je() metode je konačni.

Ova metoda provjerava je li nit živa. Nemoguće je nadjačati živ je() ispravno iz mnogih razloga. Jedna od njih je da je ova metoda izvorna. Izvorni kôd implementiran je u drugom programskom jeziku i često je specifičan za operativni sustav i hardver na kojem je pokrenut.

Stvorimo a Pas razreda i izraditi svoje zvuk() metoda konačni:

pas javne klase {javni konačni void zvuk () {// ...}}

Sada produžimo Pas razreda i pokušajte ga nadjačati zvuk() metoda:

javna klasa BlackDog proširuje Psa {javni void zvuk () {}}

Vidjet ćemo pogrešku kompajlera:

- poništava com.baeldung.finalkeyword.Dog.sound - ne može se nadjačati konačna metoda iz pseće metode () metoda je konačna i ne može se nadjačati

Ako su neke metode naše klase pozvane drugim metodama, trebali bismo razmotriti izradu pozvanih metoda konačni. Inače, njihovo poništavanje može utjecati na rad pozivatelja i izazvati iznenađujuće rezultate.

Ako naš konstruktor poziva druge metode, općenito bismo trebali deklarirati te metode konačni iz gore navedenog razloga.

Koja je razlika između izrade svih metoda predavanja konačni i obilježavanje samog razreda konačni? U prvom slučaju možemo proširiti klasu i dodati joj nove metode.

U drugom slučaju, to ne možemo učiniti.

4. Konačno Varijable

Varijable označene kao konačni ne može se preraspodijeliti. Jednom konačni varijabla je inicijalizirana, ne može se mijenjati.

4.1. Konačno Primitivne varijable

Proglasimo primitivnom konačni varijabilna ja, zatim mu dodijelite 1.

I pokušajmo mu dodijeliti vrijednost 2:

javna praznina whenFinalVariableAssign_thenOnlyOnce () {final int i = 1; // ... i = 2; }

Prevoditelj kaže:

Konačna lokalna varijabla i možda je već dodijeljena

4.2. Konačno Referentne varijable

Ako imamo a konačni referentna varijabla, ne možemo je ni dodijeliti. Ali to ne znači da je predmet na koji se odnosi nepromjenjiv. Svojstva ovog predmeta možemo slobodno mijenjati.

Da bismo to demonstrirali, proglasimo konačni referentna varijabla mačka i inicijalizirajte ga:

konačna mačka mačka = nova mačka ();

Ako ga pokušamo dodijeliti, vidjet ćemo pogrešku kompajlera:

Konačnu lokalnu varijablu mačka nije moguće dodijeliti. Mora biti prazno i ​​ne koristiti složeni zadatak

Ali možemo promijeniti svojstva Mačka primjer:

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

4.3. Konačno Polja

Konačno polja mogu biti konstante ili polja za jednokratno pisanje. Da bismo ih razlikovali, trebali bismo postaviti pitanje - bismo li uključili ovo polje ako bismo serializirali objekt? Ako nije, onda to nije dio predmeta, već konstanta.

Imajte na umu da prema konvencijama imenovanja konstante klase trebaju biti velike, a komponente odvojene znakovima donjeg crta („_“):

statički konačni int MAX_WIDTH = 999;

Imajte na umu da bilo koji konačni polje mora biti inicijalizirano prije dovršenja konstruktora.

Za statički konačni polja, to znači da ih možemo inicijalizirati:

  • nakon izjave kao što je prikazano u gornjem primjeru
  • u bloku statičkog inicijalizatora

Na primjer konačni polja, to znači da ih možemo inicijalizirati:

  • po deklaraciji
  • u bloku inicijalizatora instance
  • u konstruktoru

U suprotnom, kompajler će nam poslati pogrešku.

4.4. Konačno Argumenti

The konačni ključna riječ je također legalno staviti ispred argumenata metode. A konačni argument se ne može promijeniti unutar metode:

javna void metodaWithFinalArguments (konačni int x) {x = 1; }

Gornja dodjela uzrokuje pogrešku kompajlera:

Konačnu lokalnu varijablu x nije moguće dodijeliti. Mora biti prazno i ​​ne koristiti složeni zadatak

5. Zaključak

U ovom smo članku saznali što konačni ključna riječ znači za klase, metode i varijable. Iako možda nećemo koristiti konačni ključna riječ često u našem internom kodu, možda je dobro rješenje za dizajn.

Kao i uvijek, cjeloviti kôd za ovaj članak nalazi se u projektu GitHub.