"Hallo Amigo!"
"Hallo Bilaabo!"
"Vandaag ga ik je vertellen over verschillende trefwoorden in Java. Maar ik zal beginnen met het meest interessante: het trefwoord finale. "
"U kunt het sleutelwoord final gebruiken bij het declareren van een variabele, methode of klasse."
"En waarom hebben we finale nodig?"
"Het is vrij eenvoudig. Als we een variabele als definitief markeren, wordt deze onveranderlijk:"
final int i = 5;
i++; //Compilation error: the value of i cannot be changed.
"Ik zie."
"Als we een methode als definitief markeren, is het overschrijven van de methode in afgeleide klassen verboden:"
class Cat
{
public final String getName()
{
return "cat";
}
}
class Tiger extends Cat
{
public String getName() //Compilation error: overriding the getName()
{
return "tiger";
}
}
'Ik snap het. Maar waarom zou je het negeren van een methode moeten verbieden?'
"Nou, als voorbeeld, stel dat een programmeur veel belangrijke code in een methode heeft geschreven en wil garanderen dat alle klassen die zijn klasse overerven het gespecificeerde gedrag zullen hebben."
"En tot slot, het derde gebruik."
"Als we een klas markeren met het trefwoord definitief, dan kan deze niet worden overgeërfd."
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";
}
}
"En waarom zouden we voorkomen dat een klasse wordt geërfd?"
"Je moet begrijpen dat we niet voorkomen dat overerving vervelend is, maar eerder ter wille van de veiligheid en code-integriteit. Als overerving van klassen niet verboden is, dan is de implicatie dat het is toegestaan. En dat de code geschreven door de klasse's designer zal correct werken voor objecten van deze klasse en voor objecten van afgeleide klassen."
"Maar als een ontwikkelaar zich realiseert dat zelfs kleine veranderingen in zijn klasse ervoor zorgen dat alles niet meer werkt zoals verwacht, dan is het beter om overerving te verbieden."
"De klasse String wordt bijvoorbeeld als definitief verklaard, net als alle primitieve typen: Integer, Boolean, Double, Character..."
"Ah, begrepen. De klasse String is gemaakt als een onveranderlijke klasse en als ze plotseling veranderlijk zouden zijn, zouden veel dingen niet meer werken."
"Nou ja, bijna. Laten we het zo zeggen: alles zou bijna werken zoals voorheen, maar soms zouden er fouten zijn die erg moeilijk te vinden en te begrijpen zouden zijn. Dus in sommige gevallen is het overerven van klassen of methoden niet echt een zonde, maar het verbieden betekent minder fouten om later op te vangen."
"Waar anders kun je final gebruiken?"
"Je kunt final gebruiken vóór functieparameters en vóór variabelen in een methode. Hier is een voorbeeld:"
public void setName(final String name)
{
final String displayName = "Mr."+ name;
…
this.name = displayName;
}
"En wat heeft dat voor zin?"
"Nou, er zijn er twee. Ten eerste declareren we een variabele als definitief als we andere ontwikkelaars willen vertellen dat deze waarde een specifieke constante is, en niet zomaar een variabele."
We willen bijvoorbeeld de omzetbelasting berekenen op basis van een prijs:
public int getPriceNDS()
{
final int NDS = 20;
return this.price * NDS / 200;
}
"En ten tweede hebben we dit type variabele nodig bij het schrijven van lokale of anonieme innerlijke klassen. Ik zal je binnenkort over dit soort klassen vertellen. Maar niet vandaag."
'Oké, tot nu toe is er niets ingewikkelds geweest.'
"Houd er rekening mee dat alleen de variabele onveranderlijk wordt, niet een object waarnaar het verwijst. Het object kan nog steeds worden gewijzigd."
'Dat wilde ik eigenlijk net vragen. En er is geen manier om het object onveranderlijk te maken?'
"Nee, tenzij je een onveranderlijke klasse schrijft."
"Houd er rekening mee dat, omdat de waarde van een laatste variabele niet kan worden gewijzigd, u de beginwaarde onmiddellijk moet toewijzen."
Deze code wordt gecompileerd | Deze code wordt niet gecompileerd |
---|---|
|
|
"Maar dat gezegd hebbende, met Java kun je de initialisatie van de laatste variabelen van een klasse uitstellen tot de constructor."
Deze code wordt gecompileerd | Deze code wordt niet gecompileerd |
---|---|
|
|
"Bovendien kunnen verschillende constructors eindvariabelen met verschillende waarden initialiseren. Dit is best handig:"
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;
}
}
"Dat was een heel interessant onderwerp, en absoluut alles is logisch. Dank je, Bilaabo!"
GO TO FULL VERSION