Competentie: Ik begrijp wat de scope van een variabele is.
Specifieke leerdoelen:
{}
.Misschien heb je al gemerkt dat het soms best even puzzelen is waar je variabelen aanmaakt en vanaf welke plekken je er dan allemaal bij kunt. Soms is dat ook knap onhandig allemaal! Een variabele heeft maar een beperkt bereik (scope) en eigenlijk is het idee vrij eenvoudig en simpel
Je code bestaat uit heel veel blokken. Een blok is een stuk code dat begint met een accolade openen {
en eindigt met een accolade sluiten }
. Het lastige aan dit concept is
dat je ook heel veel blokken in blokken hebt. Ga maar na welke blokken je allemaal in onderstaande voorbeeld hebt.
public class Application implements Runnable {
public static void main(String[] args) {
SaxionApp.start(new Application(), 1024, 768);
}
public void run() {
int getal = 10;
int getal2 = sum(5, 2);
if (getal < getal2) {
SaxionApp.printLine("Getal 1 is kleiner dan getal 2");
} else {
SaxionApp.printLine("Getal 2 is kleiner dan getal 1");
}
}
public int sum(int x, int y) {
return x + y;
}
}
Zie je ze allemaal? Hier komen ze:
main
methode staat.run
methode staat.sum
methode staat beschreven.Kortom: Je code bestaat uit veel blokken en blokken kunnen worden genest (dus een blok kan in een ander blok zitten). Bij het uitvoeren van een programma zal een blok “gewoon” van boven naar beneden uitgevoerd worden.
Nou, een variabele bestaat alleen in het blok waarin je hem gemaakt hebt. Zodra het blok eindigt is je variabele ook weg. Natuurlijk bestaat de variabele ook pas in de regels nadat je hem gemaakt hebt. Ingewikkeld? Nee hoor, We leggen het uit aan de hand van het stukje code hierboven.
int getal
is beschikbaar in de hele run methode. Dus vanaf dat je hem gemaakt hebt helemaal tot het eind. Ook in de blokken in de run methode (dus die van de if) kun je hem gebruiken.int getal2
is ook bijna beschikbaar in de hele run methode. Alleen je kunt hem natuurlijk niet gebruiken in die regel die erboven staat, want daar bestaat ie nog niet ;-).sum
, dus de X en de Y, zijn alleen beschikbaar in die methode, daarbuiten kun je er verder niet bij en bestaan ze ook niet meer. Wat natuurlijk wel beschikbaar is is de uitvoer van de sum methode (dus datgene wat hij returnd).Een goed gebruik is om variabelen een zo klein mogelijke scope te geven, dus ze te maken binnen het blok waar je ze nodig hebt. Dat is lekker efficient voor het geheugengebruik van je programma, omdat hij steeds na een blok alle variabelen weer opruimt.
Verder is één “truukje” nog wel handig. Als je een variabele wilt hebben die je in je hele programma kunt gebruiken (dus in alle methodes), dan kun je hem bovenaan in je programma aanmaken, direct onder de eerste regel. Dit noem je een globale variabele. Dus bijvoorbeeld zo:
public class Application implements Runnable {
ArrayList<String> names = new ArrayList<String>();
public static void main(String[] args) {
SaxionApp.start(new Application(), 1024, 768);
}
public void run() {
//Je kunt nu hier bij de lijst namen
names.add("Mary");
names.add("John");
names.add("Rachel");
String name = bepaalEerste();
}
public String bepaalEerste() {
//En hier ook!
if (names.size() > 0) {
return names.get(0);
}
return "";
}
}
Let erop dat je hier voorzichtig mee bent, omdat je variabelen altijd een zo klein mogelijke scope wilt geven. Ga dus niet klakkeloos alle variabelen als globaal boven in je programma zetten. Doe het alleen als het echt noodzakelijk is.