variabele scoping
elke variabele is alleen beschikbaar (en toegankelijk) in de context waarin het is gedeclareerd. Om de context te bepalen, refereer je naar de dichtstbijzijnde openings-en sluitmarkeringen die de declaratie omringen. De meeste programmeertalen gebruiken accolades ({}
) om het begin en het einde van een blok code aan te geven. Bekijk dit voorbeeld:
Het is niet nodig om elk stukje code hier te begrijpen; focus gewoon op de accolades. 🙂 Wanneer we praten over de beschikbaarheid van een variabele binnen een context, we verwijzen naar scope. Hier kunt u zien dat de variabele root
is gedeclareerd tussen de twee accolades omcirkeld in paars. De omvang van die variabele is alles tussen die twee beugels.
het bereik van een variabele kan zowel lokaal als globaal zijn, afhankelijk van waar een variabele wordt gedeclareerd. Een globale variabele kan beschikbaar zijn voor alle klassen en methoden binnen een programma, terwijl een lokale variabele alleen beschikbaar kan zijn binnen de methode die wordt gedeclareerd in:
Hier hebben we de code een beetje uitgebreid en breidde ons eerste blok code uit met een andere! Als je de paarse lijnen volgt, kun je zien dat de haakjes van het eerste blok alle code van het tweede blok omvatten. Vervolgens kunt u zien dat een nieuwe variabele, spy
, is gedeclareerd binnen de groene lokale scope.
aangezien deroot
variabele is gedeclareerd in de Globale scope, betekent dit dat het toegankelijk is voor alles binnen de paarse haakjes, inclusief alles gedeclareerd in de lokale scope. In het tweede blok code, kan je een regel zien net onder de Spy variabele declaratie die root
gebruikt. Dat mag!
echter, wat zich in de lokale scope bevindt is niet beschikbaar voor de Globale scope, of andere lokale blokken code. Laten we een ander voorbeeld bekijken:
Hier hebben we een ander blok code toegevoegd, dat zijn eigen lokale scope en zijn eigen variabele heeft, anotherSpy
. Bekijk nu de laatste regel in ons Spy variabele blok:
System.out.println(anotherSpy); // Error
ziet eruit alsof er een fout is! Dat komt omdat het de anotherSpy
variabele probeert te gebruiken. Maar dat kan niet omdat anotherSpy
niet binnen de Globale scope of in dezelfde lokale scope valt. Dat betekent dat dit blok code er geen toegang toe heeft. anotherSpy
is alleen beschikbaar in het blok code waarin het is gedeclareerd.
hetzelfde geldt in de andere richting. U kunt zien dat de laatste regel van ons laatste blok code ook een fout heeft:
System.out.println(spy); // Error
Hier probeert het de variabele spy van een ander blok code te gebruiken. Maar dat kan niet omdat spy
niet in dezelfde scope zit als het codeblok dat het probeert te gebruiken.
variabelbereik in klassen
wanneer u een klasse declareert, gelden dezelfde algemene regels voor scoping: elke variabele is alleen toegankelijk binnen het declaratieblok. Laten we experimenteren met een unicorn-klasse:
net als in ons eerste voorbeeld zijn er zowel globale als lokale klassenvariabelen. Laten we bekijken in detail:
-
De variabelen
height
enpower
Zijn velden van de klasse en zijn overal binnen de klasse toegankelijk. -
de variabele
minutesToSleep
is alleen toegankelijk binnen het lokale bereik van het blok code waarin het is gedeclareerd. -
de variabele
minutesToRun
is alleen toegankelijk binnen het lokale bereik van het blok code waarin het is gedeclareerd.
de reikwijdte van een variabele beperkt de toegankelijkheid per definitie. Echter, klasse velden zijn toegankelijk buiten de klasse en kunnen worden gebruikt door elk ander blok code.
in ons voorbeeld zijn deze height
en power
. Als we een Unicorn variabele declareren, kunnen we deze waarden lezen of wijzigen:
in staat zijn om te knoeien met klasse variabelen kan ernstige gevolgen hebben. Het goede nieuws is – je kunt dat controleren! Voordat we kijken hoe, moet u oefenen met variabele scoping.
probeer het zelf uit!
Toegangscontrole
We gaan het idee van toegangscontrole gebruiken door beperkte toegang tot een klasse, module of bestand te implementeren. Je weet al wat een klas en een dossier zijn sinds we met ze werken!
een module is een bundel van gerelateerde bronbestanden geassocieerd met een naam, zoals een framework. Een framework is een verzameling functionaliteiten gegroepeerd naar een bepaalde context. Het versnelt het ontwikkelingsproces en geeft richtlijnen over hoe de code te schrijven.
elke ontwikkelomgeving biedt een aantal frameworks. Het feit is dat de implementatie van deze frameworks is veel verder dan wat de ontwikkelaars die ze gebruiken kunnen zien en gebruiken. Dat wordt gedaan door de toegang te beperken tot de details van de implementatie, ook wel bekend als het implementeren van toegangscontrole.
Control levels
In Java moet u een van de sleutelwoorden gebruiken om een control level aan te duiden:
-
Public: visible to the world and therefore the least restrictive
-
Protected: visible to the package and all its subclasses
-
Package-protected: meestal alleen zichtbaar voor het pakket waarin ze zich bevinden (standaardinstellingen)
-
privé: alleen toegankelijk in de context waarin ze zijn gedefinieerd (binnen de klasse waarin ze zich bevinden)
door deze afzonderlijke beperkingen in te voeren, wordt de ontwikkeling een stuk eenvoudiger. U hoeft zich geen zorgen te maken over ongewenste zichtbaarheid van uw implementatie en meer nog, ongewenste wijzigingen.
plaats een geschikt trefwoord voor de gerelateerde declaratie:
dan, als je probeert toegang te krijgen tot privé-leden van buiten de klasse, krijg je fouten:
De besturingsniveaus kunnen zowel aan klasse-elementen als aan klassen worden toegewezen:
public class PublicClass {}private class PrivateClass {}
naast beveiliging biedt het specificeren van besturingsniveaus voor klasse-leden een betere leesbaarheid. Wanneer een ontwikkelaar een bronbestand klaarmaakt, is het altijd duidelijk welke elementen extern kunnen worden gebruikt.
hiërarchie van controle
een element kan hetzelfde of restrictiever controleniveau hebben dan het element dat het bevat:
in het voorbeeld hierboven wordt de klasse gedeclareerd als public
. Aangezien de klasse het bevattende element is, betekent dit dat alle elementen van die klasse hetzelfde of een lager blootstellingsniveau kunnen hebben. In dit geval omvat het alle niveaus.
Als u een klasse declareert als private
, kunnen de elementen alleen package-private
of private
:
class PrivateClass { int internalProperty = 0; // automatically assigned package-private by default protected defaultProperty = true; // automatically assigned package-private public boolean publicProperty = true; // automatically converted to package-private private String fileprivateProperty = "Hello!"; //only available to the class private static void privateMethod() { }}
in het bovenstaande voorbeeld hebben we een attribuut toegevoegd zonder een expliciet sleutelwoord voor toegangscontrole. In dit scenario neemt het standaard het niveau van het bevattende element aan. In dit geval is het onze klasse, dus het neemt het niveau van PrivateClass
aan.
een topklasse kan niet als privé worden gemarkeerd, maar als u deze standaard instelt, wordt deze in het pakketbeveiligde niveau geplaatst. Wanneer een variabele van een klasse wordt gedeclareerd, moet, indien het controleniveau van de declaratiecontext hoger is dan dat van de klasse, de variabele ook een expliciet controleniveau hebben. Laten we een fileprivateclass variabele declareren:
String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok
zoals u kunt zien, als het Standaard toegangsniveau van de context van de variabele hoger is dan een klasse die u eraan toewijst, moet u expliciet het niveau van de variabele opgeven als hetzelfde of lager dan dat van de klasse.
samenvatting
In dit hoofdstuk hebt u geleerd over de toegankelijkheid van variabele:
-
een bereik van een variabele is het codegebied waar het is gedeclareerd.
-
algemeen bereik van de variabele is van toepassing op alle codeblokken, inclusief klassen.
-
een andere noodzakelijke manier om de toegang tot variabelen en functies te beheren is het gebruik van besturingsniveaus: publiek, beveiligd, pakket-beveiligd en privé.