A „végső” kulcsszó Java-ban

1. Áttekintés

Míg az öröklés lehetővé teszi számunkra a meglévő kód újrafelhasználását, néha szükségünk van rá korlátokat szabjon a nyújthatóságra különféle okokból; a végső kulcsszó lehetővé teszi számunkra, hogy pontosan ezt.

Ebben az oktatóanyagban megvizsgáljuk, hogy mi a végső kulcsszó jelentése osztályok, módszerek és változók számára.

2. Végső Osztályok

A következőként megjelölt osztályok: végső nem lehet meghosszabbítani. Ha megnézzük a Java magkönyvtárak kódját, sokakat találunk végső osztályok ott. Ilyen például a Húr osztály.

Vegye figyelembe a helyzetet, ha kibővíthetjük a Húr osztály, felülírja bármelyik módszerét, és az összes Húr példányok a sajátos példányainkkal Húr alosztály.

A műveletek eredménye Húr a tárgyak ekkor kiszámíthatatlanná válnak. És tekintettel arra, hogy a Húr osztályt mindenhol használják, ez elfogadhatatlan. Ezért a Húr osztály van jelölve végső.

Bármely öröklési kísérlet a végső osztály fordítói hibát okoz. Ennek bemutatására hozzuk létre a végső osztály Macska:

public final class Cat {private int weight; // standard getter és setter}

És próbáljuk meg kiterjeszteni:

a BlackCat nyilvános osztály kiterjeszti a macskát {}

Meglátjuk a fordító hibáját:

A BlackCat típus nem tudja alosztályba sorolni a végső Cat osztályt

Vegye figyelembe, hogy a végső kulcsszó egy osztálydeklarációban nem jelenti azt, hogy ennek az osztálynak az objektumai megváltoztathatatlanok. Megváltoztathatjuk a Macska tárgy szabadon:

Macskamacska = új Macska (); cat.setWeight (1); assertEquals (1, cat.getWeight ()); 

Csak nem tudjuk meghosszabbítani.

Ha szigorúan betartjuk a jó tervezés szabályait, akkor gondosan létre kell hoznunk és dokumentálnunk kell egy osztályt, vagy deklarálnunk kell róla végső biztonsági okokból. A létrehozás során azonban körültekintően kell eljárnunk végső osztályok.

Vegyük észre, hogy osztályt készítünk végső azt jelenti, hogy más programozó nem javíthatja. Képzelje el, hogy osztályt használunk, és nincs hozzá forráskódunk, és egy módszerrel van probléma.

Ha az osztály az végső, nem terjeszthetjük ki a módszer felülírására és a probléma megoldására. Más szavakkal, elveszítjük a bővíthetőséget, az objektumorientált programozás egyik előnyét.

3. Végső Mód

A jelöléssel ellátott módszerek végső nem írható felül. Amikor egy osztályt tervezünk, és úgy érezzük, hogy egy módszert nem szabad felülírni, akkor elkészíthetjük ezt a módszert végső. Sokakat is találhatunk végső módszerek a Java magkönyvtárakban.

Néha nem kell teljesen megtiltanunk egy osztálybővítést, hanem csak egyes módszerek felülírását akadályozzuk meg. Jó példa erre a cérna osztály. Legális kiterjeszteni és így létrehozni egy egyedi szálosztályt. De ez életben van() módszerek az végső.

Ez a módszer ellenőrzi, hogy egy szál él-e. Lehetetlen felülírni a életben van() módszer sok okból. Az egyik az, hogy ez a módszer natív. A natív kód egy másik programozási nyelven valósul meg, és gyakran az operációs rendszerre és a futó hardverre jellemző.

Hozzunk létre egy Kutya osztály és tegye meg hang() módszer végső:

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

Most hosszabbítsuk meg a Kutya osztályban, és próbálja felülírni azt hang() módszer:

a nyilvános osztályú BlackDog kiterjeszti a kutyát {public void sound () {}}

Meglátjuk a fordító hibáját:

- felülbírálja a com.baeldung.finalkeyword.Dog.sound - A végső metódust nem lehet felülírni a Dog sound () metódus végleges és nem írható felül

Ha osztályunk egyes módszereit más módszerekkel hívjuk meg, fontolóra kell vennünk a meghívott módszerek elkészítését végső. Ellenkező esetben a felülbírálás befolyásolhatja a hívók munkáját és meglepő eredményeket hozhat.

Ha konstruktorunk más módszereket hív meg, akkor ezeket a módszereket általában deklarálnunk kell végső a fenti okból.

Mi a különbség az osztály összes módszerének elkészítése között végső és maga az osztály megjelölése végső? Az első esetben kibővíthetjük az osztályt, és új módszereket adhatunk hozzá.

A második esetben ezt nem tudjuk megtenni.

4. Végső Változók

A következőként megjelölt változók: végső nem lehet áthelyezni. Egyszer végső változó inicializálva van, nem módosítható.

4.1. Végső Primitív változók

Nyilatkozjunk primitívnek végső változó én, majd rendeljen hozzá 1-et.

Próbáljunk hozzá 2-es értéket rendelni:

public void whenFinalVariableAssign_thenOnlyOnce () {final int i = 1; // ... i = 2; }

A fordító azt mondja:

Lehet, hogy már hozzárendelték a végső i változót

4.2. Végső Referencia-változók

Ha van egy végső referencia változó, azt sem tudjuk újból kiosztani. De ez nem azt jelenti, hogy az általa hivatkozott tárgy megváltoztathatatlan. Az objektum tulajdonságait szabadon megváltoztathatjuk.

Ennek bemutatásához nyilvánítsuk ki a végső referencia változó macska és inicializálja:

végső macska macska = új macska ();

Ha megpróbáljuk újra hozzárendelni, fordító hibát fogunk látni:

A végső helyi változó macska nem rendelhető hozzá. Ennek üresnek kell lennie, és nem használhat összetett hozzárendelést

De megváltoztathatjuk a tulajdonságait Macska példa:

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

4.3. Végső Mezők

Végső mezők lehetnek konstansok vagy egyszer írható mezők. Megkülönböztetésükhöz fel kell tennünk egy kérdést - beillesztenénk-e ezt a mezőt, ha az objektumot sorosítjuk? Ha nem, akkor ez nem az objektum része, hanem állandó.

Ne feledje, hogy az elnevezési szokások szerint az osztályállandóknak nagybetűket kell írni, az összetevőket aláhúzással („_”) elválasztva:

statikus végső int MAX_WIDTH = 999;

Vegye figyelembe, hogy Bármi végső a mezőt inicializálni kell, mielőtt a kivitelező befejezné.

Mert statikus döntő mezőket, ez azt jelenti, hogy inicializálhatjuk őket:

  • a fenti példában bemutatott nyilatkozat alapján
  • a statikus inicializáló blokkban

Például végső mezőket, ez azt jelenti, hogy inicializálhatjuk őket:

  • nyilatkozat után
  • a példány inicializáló blokkjában
  • a konstruktorban

Ellenkező esetben a fordító hibát ad nekünk.

4.4. Végső Érvek

A végső a kulcsszó a metódus argumentumok elé helyezése is legális. A végső argumentum nem módosítható egy módszer belsejében:

public void methodWithFinalArguments (végső int x) {x = 1; }

A fenti hozzárendelés a fordító hibáját okozza:

A végső x változó nem rendelhető hozzá. Ennek üresnek kell lennie, és nem használhat összetett hozzárendelést

5. Következtetés

Ebben a cikkben megtudtuk, mi a végső kulcsszó jelentése osztályok, módszerek és változók számára. Bár nem használhatjuk a végső kulcsszó gyakran a belső kódunkban, ez jó tervezési megoldás lehet.

Mint mindig, a cikk teljes kódja megtalálható a GitHub projektben.