végső és egyéb Java kulcsszavak - 1

– Szia Amigo!

– Szia, Bilaabo!

"Ma több kulcsszóról fogok mesélni a Java nyelven. De kezdem a legérdekesebbel: a kulcsszó véglegesével. "

"Használhatja a final kulcsszót változó, metódus vagy osztály deklarálásakor."

– És miért van szükségünk a döntőre?

"Ez elég egyszerű. Ha egy változót véglegesnek jelölünk, akkor megváltoztathatatlanná válik:"

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"Látom."

"Ha egy metódust véglegesnek jelölünk meg, akkor a származtatott osztályokban a metódus felülbírálása tilos:"

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

– Értem. De miért kellene megtiltania egy módszer felülbírálását?

"Példaként tegyük fel, hogy egy programozó sok fontos kódot írt egy metódusba, és garantálni akarja, hogy minden osztály, amely örökli az osztályát, a megadott viselkedést fogja tanúsítani."

– És végül a harmadik használat.

"Ha egy osztályt a final kulcsszóval jelölünk meg, akkor az nem örökölhető."

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

– És miért akadályoznánk meg egy osztály öröklődését?

"Meg kell értenie, hogy nem akadályozzuk meg, hogy az öröklődés bosszantó legyen, hanem inkább a biztonság és a kód integritása érdekében. Ha az osztályöröklés nincs tiltva, akkor ebből az következik, hogy megengedett. És hogy az osztály által írt kód A tervező megfelelően fog működni az ehhez az osztályhoz tartozó objektumokhoz, valamint bármely származtatott osztályhoz."

"De ha egy fejlesztő rájön, hogy az osztályán végzett apró változtatások miatt minden nem működik a várt módon, akkor jobb, ha megtiltja az öröklést."

"Például a String osztály véglegesnek van deklarálva, csakúgy, mint minden primitív típus: egész, logikai, kettős, karakter…"

"Ah, értem. A String osztályt megváltoztathatatlan osztályként hozták létre, és ha hirtelen változtathatóak lennének, akkor sok minden leállna."

"Nos, majdnem. Fogalmazzunk úgy: minden szinte úgy működne, mint korábban, de néha előfordulnának olyan hibák, amelyeket nagyon nehéz lenne megtalálni és megérteni. Tehát bizonyos esetekben az osztályok vagy módszerek öröklése nem igazán bűn, de ennek megtiltása kevesebb hibát jelent, amelyet később észrevesz."

"Hol használhatod még a döntőt?"

"Használhatja a végső függvényparamétereket és a változók előtti metódusokat. Íme egy példa:

public void setName(final String name)
{
 final String displayName = "Mr."+ name;
  …
 this.name = displayName;
}

– És ennek mi értelme?

"Nos, kettő van. Először is véglegesnek nyilvánítunk egy változót, ha azt akarjuk mondani a többi fejlesztőnek, hogy ez az érték egy konkrét állandó, és nem csak egy változó."

Például a forgalmi adót egy ár alapján szeretnénk kiszámítani:

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

"Másodszor pedig szükségünk van erre a típusú változóra, amikor helyi vagy névtelen belső osztályokat írunk. Hamarosan mesélek az ilyen típusú órákról. De nem ma."

– Oké, eddig nem volt semmi túl bonyolult.

"Kérjük, vegye figyelembe, hogy csak a változó válik megváltoztathatatlanná, egy objektum nem, amelyre hivatkozhat. Az objektum továbbra is megváltoztatható."

– Valójában éppen erről akartam kérdezni. És nincs mód arra, hogy a tárgyat megváltoztathatatlanná tegyük?

– Nem, hacsak nem írsz egy megváltoztathatatlan osztályt.

"Kérjük, vegye figyelembe, hogy mivel egy végső változó értéke nem változtatható meg, azonnal hozzá kell rendelnie a kezdeti értékét."

Ez a kód le lesz fordítva Ez a kód nem fordítódik le
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

"De ennek ellenére a Java lehetővé teszi, hogy késleltesse az osztály végső változóinak inicializálását a konstruktorig."

Ez a kód le lesz fordítva Ez a kód nem fordítódik le
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

"Emellett a különböző konstruktorok különböző értékekkel inicializálhatják a végső változókat. Ez nagyon kényelmes:"

Ez a kód le lesz fordítva
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

"Ez egy nagyon érdekes téma volt, és abszolút mindennek van értelme. Köszönöm, Bilaabo!"