sidste og andre Java-nøgleord - 1

"Hej, Amigo!"

"Hej, Bilaabo!"

"I dag vil jeg fortælle dig om flere søgeord i Java. Men jeg starter med det mest interessante: søgeordet endelig. "

"Du kan bruge søgeordet final , når du erklærer en variabel, metode eller klasse."

"Og hvorfor har vi brug for endelig?"

"Det er ret simpelt. Hvis vi markerer en variabel som endelig, så bliver den uforanderlig:"

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

"Jeg ser."

"Hvis vi markerer en metode som endelig, er det forbudt at tilsidesætte metoden i afledte klasser:"

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

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

"Jeg forstår det. Men hvorfor skulle du forbyde at tilsidesætte en metode?"

"Tja, antag som et eksempel, at en programmør har skrevet en masse vigtig kode i en metode og vil garantere, at alle klasser, der arver hans klasse, vil have den specificerede adfærd."

"Og endelig den tredje anvendelse."

"Hvis vi markerer en klasse med søgeordet final, så kan den ikke nedarves."

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

"Og hvorfor skulle vi forhindre en klasse i at blive arvet?"

"Du skal forstå, at vi ikke forhindrer, at arv er irriterende, men derimod af hensyn til sikkerheden og kodeintegriteten. Hvis klassearv ikke er forbudt, så er implikationen, at det er tilladt. Og at koden skrevet af klassens designer vil fungere korrekt for objekter af denne klasse såvel som objekter af afledte klasser."

"Men hvis en udvikler indser, at selv små ændringer i hans klasse vil få alt til at holde op med at fungere som forventet, så er det bedre at forbyde arv."

"For eksempel er String-klassen erklæret som endelig, ligesom alle primitive typer: Heltal, Boolean, Dobbelt, Tegn..."

"Ah, forstår det. String-klassen blev skabt som en uforanderlig klasse, og hvis de pludselig var foranderlige, ville mange ting holde op med at fungere."

"Nå, næsten. Lad os sige det sådan: alt ville fungere næsten som før, men nogle gange ville der være fejl, som ville være meget svære at finde og forstå. Så i nogle tilfælde er det ikke rigtig synd at arve klasser eller metoder, men at forbyde det betyder færre fejl at fange senere."

"Hvor kan du ellers bruge finalen?"

"Du kan bruge final before-funktionsparametre og før-variabler i en metode. Her er et eksempel:"

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

"Og hvad er meningen med det?"

"Nå, der er to. For det første erklærer vi en variabel som endelig, hvis vi vil fortælle andre udviklere, at denne værdi er en specifik konstant og ikke kun en variabel."

For eksempel ønsker vi at beregne moms baseret på en pris:

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

"Og for det andet har vi brug for denne type variabel, når vi skriver lokale eller anonyme indre klasser. Jeg vil snart fortælle dig om disse typer klasser. Men ikke i dag."

"Okay, indtil videre har der ikke været noget for kompliceret."

"Bemærk venligst, at kun variablen bliver uforanderlig, ikke et objekt, den kan referere til. Objektet kan stadig ændres."

"Jeg var faktisk lige ved at spørge om det. Og der er ingen måde at gøre objektet uforanderligt?"

"Nej, medmindre du skriver en uforanderlig klasse."

"Bemærk venligst, at fordi værdien af ​​en endelig variabel ikke kan ændres, skal du tildele dens startværdi med det samme."

Denne kode vil kompilere Denne kode vil ikke kompilere
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()
 {
 }
}

"Men når det er sagt, giver Java dig mulighed for at forsinke initialisering af en klasses endelige variable indtil konstruktøren."

Denne kode vil kompilere Denne kode vil ikke kompilere
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;
 }
}

"Derudover kan forskellige konstruktører initialisere endelige variabler med forskellige værdier. Dette er ret praktisk:"

Denne kode vil kompilere
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;
 }
}

"Det var et virkelig interessant emne, og absolut alt giver mening. Tak, Bilaabo!"