final и други Java ключови думи - 1

„Здрасти, Амиго!“

„Здравей, Билаабо!“

„Днес ще ви разкажа за няколко ключови думи в Java. Но ще започна с най-интересното: ключовата дума final.

„Можете да използвате ключовата дума final , когато декларирате променлива, метод or клас.“

"И защо имаме нужда от финал?"

„Доста е просто. Ако маркираме променлива като окончателна, тя става непроменима:“

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

"Виждам."

„Ако маркираме метод като окончателен, тогава замяната на метода в производни класове е забранена:“

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

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

„Разбирам. Но защо трябва да забранявате замяната на метод?“

„Е, като пример, да предположим, че програмист е написал много важен code в метод и иска да гарантира, че всички класове, които наследяват неговия клас, ще имат определеното поведение.“

"И накрая, третото използване."

„Ако маркираме клас с ключовата дума final, тогава той не може да бъде наследен.“

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

„И защо да предотвратяваме наследяването на клас?“

„Трябва да разберете, че ние не предотвратяваме наследяването да бъде досадно, а по-скоро в името на сигурността и целостта на codeа. Ако наследяването на класове не е забранено, тогава внушението е, че е разрешено. И че codeът, написан от класа дизайнерът ще работи правилно за обекти от този клас, Howто и за обекти от всички производни класове."

„Но ако разработчик осъзнае, че дори малки промени в неговия клас ще накарат всичко да спре да работи според очакванията, тогава е по-добре да забрани наследяването.“

„Например, класът String е деклариран като окончателен, Howто и всички примитивни типове: Integer, Boolean, Double, Character…“

„А, разбрах. Класът String е създаден като неизменен клас и ако изведнъж станат променливи, тогава много неща ще спрат да работят.“

„Е, почти. Нека го кажем така: всичко ще работи почти Howто преди, но понякога ще има грешки, които биха бor много трудни за намиране и разбиране. Така че в някои случаи наследяването на класове or методи всъщност не е грях, но забраната означава по-малко грешки за улавяне по-късно."

„Къде другаде можете да използвате final?“

„Можете да използвате параметри на функцията final before и преди променливи в метод. Ето един пример:“

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

— И Howъв е смисълът от това?

„Е, има две. Първо, ние декларираме променлива като окончателна, ако искаме да кажем на другите разработчици, че тази стойност е специфична константа, а не просто променлива.“

Например, искаме да изчислим данъка върху продажбите въз основа на цена:

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

„И второ, имаме нужда от този тип променлива, когато пишем локални or анонимни вътрешни класове. Скоро ще ви разкажа за тези типове класове. Но не днес.“

— Добре, досега не е имало нищо твърде сложно.

„Моля, имайте предвид, че само променливата става непроменяема, а не обект, към който може да се отнася. Обектът все още може да бъде променен.“

"Всъщност тъкмо щях да попитам за това. И няма начин да направим обекта непроменим?"

„Не, освен ако не напишете неизменен клас.“

„Моля, имайте предвид, че тъй като стойността на крайната променлива не може да бъде променена, трябва незабавно да присвоите нейната първоначална стойност.“

Този code ще се компorра Този code няма да се компorра
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()
 {
 }
}

„Но въпреки това Java ви позволява да отложите инициализацията на крайните променливи на класа до конструктора.“

Този code ще се компorра Този code няма да се компorра
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;
 }
}

"Освен това различни конструктори могат да инициализират крайни променливи с различни стойности. Това е доста удобно:"

Този code ще се компorра
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;
 }
}

„Това беше наистина интересна тема и абсолютно всичко има смисъл. Благодаря ти, Билаабо!“