cuvinte cheie finale și alte cuvinte cheie Java - 1

"Bună, Amigo!"

— Bună, Bilaabo!

„Astăzi vă voi spune despre câteva cuvinte cheie în Java. Dar voi începe cu cel mai interesant: cuvântul cheie final.

„Puteți folosi cuvântul cheie final când declarați o variabilă, o metodă sau o clasă.”

— Și de ce avem nevoie de final?

„Este destul de simplu. Dacă marcăm o variabilă ca finală, atunci aceasta devine neschimbabilă:”

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

"Înțeleg."

„Dacă marchem o metodă ca finală, atunci este interzisă suprascrierea metodei în clasele derivate:”

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

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

— Înțeleg. Dar de ce ar trebui să interziceți anularea unei metode?

„Ei bine, de exemplu, să presupunem că un programator a scris mult cod important într-o metodă și dorește să garanteze că toate clasele care moștenesc clasa sa vor avea comportamentul specificat.”

„Și în sfârșit, a treia utilizare”.

„Dacă marchem o clasă cu cuvântul cheie final, atunci nu poate fi moștenită.”

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";
 }
}

— Și de ce am împiedica moștenirea unei clase?

„Ar trebui să înțelegeți că nu împiedicăm moștenirea să fie enervantă, ci mai degrabă de dragul securității și integrității codului. Dacă moștenirea clasei nu este interzisă, atunci implicația este că este permisă. Și că codul scris de către clasa designerul va funcționa corect pentru obiectele acestei clase, precum și pentru obiectele oricăror clase derivate."

„Dar dacă un dezvoltator realizează că chiar și micile modificări aduse clasei sale vor face ca totul să nu mai funcționeze așa cum era de așteptat, atunci este mai bine să interziceți moștenirea.”

„De exemplu, clasa String este declarată finală, la fel ca toate tipurile primitive: Integer, Boolean, Double, Character...”

"Ah, am înțeles. Clasa String a fost creată ca o clasă imuabilă și dacă ar fi brusc mutabile, atunci multe lucruri ar înceta să funcționeze."

„Ei bine, aproape. Să spunem așa: totul ar funcționa aproape ca înainte, dar uneori ar fi erori care ar fi foarte greu de găsit și de înțeles. Așa că, în unele cazuri, moștenirea claselor sau a metodelor nu este cu adevărat un păcat, dar interzicerea ei înseamnă mai puține erori de prins mai târziu.”

"Unde mai poți folosi final?"

„Puteți folosi parametrii final înainte de funcție și înainte de variabile într-o metodă. Iată un exemplu:”

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

— Și ce rost are asta?

„Ei bine, sunt două. În primul rând, declarăm o variabilă ca finală dacă vrem să spunem altor dezvoltatori că această valoare este o constantă specifică, și nu doar o variabilă.”

De exemplu, dorim să calculăm taxa pe vânzări pe baza unui preț:

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

"Și în al doilea rând, avem nevoie de acest tip de variabilă atunci când scriem clase interne locale sau anonime. Vă voi spune despre aceste tipuri de cursuri în curând. Dar nu astăzi."

— Bine, până acum nu a fost nimic prea complicat.

„Vă rugăm să rețineți că numai variabila devine neschimbabilă, nu un obiect la care s-ar putea referi. Obiectul poate fi în continuare schimbat.”

„De fapt tocmai eram pe cale să întreb despre asta. Și nu există nicio modalitate de a face obiectul neschimbabil?”

— Nu, dacă nu scrii o clasă imuabilă.

„Vă rugăm să rețineți că, deoarece valoarea unei variabile finale nu poate fi modificată, trebuie să îi atribuiți imediat valoarea inițială.”

Acest cod se va compila Acest cod nu se va compila
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()
 {
 }
}

„Dar, acestea fiind spuse, Java vă permite să amânați inițializarea variabilelor finale ale unei clase până la constructor.”

Acest cod se va compila Acest cod nu se va compila
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;
 }
}

„În plus, diferiți constructori pot inițializa variabilele finale cu valori diferite. Acest lucru este destul de convenabil:”

Acest cod se va compila
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;
 }
}

"Acesta a fost un subiect cu adevărat interesant și absolut totul are sens. Mulțumesc, Bilaabo!"