siste og andre Java-nøkkelord - 1

"Hei, Amigo!"

"Hei, Bilaabo!"

"I dag skal jeg fortelle deg om flere søkeord i Java. Men jeg starter med det mest interessante: nøkkelordet finalen. "

"Du kan bruke nøkkelordet final når du erklærer en variabel, metode eller klasse."

"Og hvorfor trenger vi endelig?"

"Det er ganske enkelt. Hvis vi markerer en variabel som endelig, blir den uforanderlig:"

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

"Jeg skjønner."

"Hvis vi markerer en metode som endelig, er det forbudt å overstyre metoden i avledede klasser:"

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

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

"Jeg skjønner. Men hvorfor skulle du forby å overstyre en metode?"

"Vel, for eksempel, anta at en programmerer har skrevet mye viktig kode i en metode og ønsker å garantere at alle klasser som arver klassen hans vil ha den spesifiserte oppførselen."

"Og til slutt, den tredje bruken."

"Hvis vi markerer en klasse med nøkkelordet final, kan den ikke arves."

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 at en klasse går i arv?"

"Du bør forstå at vi ikke forhindrer at arv er plagsomt, men heller av hensyn til sikkerheten og kodeintegriteten. Hvis klassearv ikke er forbudt, så er implikasjonen at det er tillatt. Og at koden skrevet av klassens designer vil fungere riktig for objekter av denne klassen, så vel som objekter av eventuelle avledede klasser."

"Men hvis en utvikler innser at selv små endringer i klassen hans vil føre til at alt slutter å fungere som forventet, så er det bedre å forby arv."

"For eksempel er String-klassen erklært som endelig, i likhet med alle primitive typer: heltall, boolsk, dobbel, tegn ..."

"Ah, skjønner det. String-klassen ble opprettet som en uforanderlig klasse, og hvis de plutselig var foranderlige, ville mange ting slutte å fungere."

"Vel, nesten. La oss si det slik: alt ville fungere nesten som før, men noen ganger ville det være feil som ville være svært vanskelig å finne og forstå. Så i noen tilfeller er det ikke synd å arve klasser eller metoder, men å forby det betyr færre feil å fange senere."

"Hvor ellers kan du bruke finalen?"

"Du kan bruke final before-funksjonsparametere 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 hva er vitsen med det?"

"Vel, det er to. Først erklærer vi en variabel som endelig hvis vi vil fortelle andre utviklere at denne verdien er en spesifikk konstant, og ikke bare en variabel."

For eksempel ønsker vi å beregne merverdiavgiften basert på en pris:

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

"Og for det andre trenger vi denne typen variabel når vi skriver lokale eller anonyme indre klasser. Jeg skal fortelle deg om denne typen klasser snart. Men ikke i dag."

"Ok, så langt har det ikke vært noe for komplisert."

"Vær oppmerksom på at bare variabelen blir uforanderlig, ikke et objekt den kan referere til. Objektet kan fortsatt endres."

"Jeg skulle egentlig bare spørre om det. Og det er ingen måte å gjøre objektet uforanderlig?"

"Nei, med mindre du skriver en uforanderlig klasse."

"Vær oppmerksom på at fordi verdien til en endelig variabel ikke kan endres, må du tilordne den opprinnelige verdien umiddelbart."

Denne koden vil kompilere Denne koden 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, lar Java deg utsette initialiseringen av en klasses endelige variabler til konstruktøren."

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

"I tillegg kan forskjellige konstruktører initialisere sluttvariabler med forskjellige verdier. Dette er ganske praktisk:"

Denne koden 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 veldig interessant emne, og absolutt alt gir mening. Takk, Bilaabo!"