variabel scoping
hver variabel er kun tilgængelig (og tilgængelig) i den sammenhæng, inden for hvilken den er blevet erklæret. For at bestemme konteksten henvises til de nærmeste åbnings-og lukkemærker, der omgiver erklæringen. De fleste programmeringssprog bruger krøllede seler ({}
) for at markere begyndelsen og slutningen af en blok kode. Tjek dette eksempel:
Der er ingen grund til at forstå hver bit kode her; bare fokusere på de krøllede seler. Når vi taler om tilgængeligheden af en variabel inden for en kontekst, henviser vi til omfang. Her kan du se, at variablen root
er blevet erklæret mellem de to krøllede seler, der er cirklet i lilla. Omfanget af denne variabel er alt mellem disse to seler.
omfanget af en variabel kan være lokalt såvel som globalt, afhængigt af hvor en variabel er erklæret. En global variabel kan være tilgængelig for alle klasser og metoder inden for et program, mens en lokal variabel muligvis kun er tilgængelig inden for den metode, den er erklæret i:
Her, Vi har udvidet koden lidt og udvidet vores første kodeblok til at omfatte en anden! Hvis du sporer de lilla linjer, kan du se, at parenteserne fra den første blok omfatter hele koden fra den anden. Dernæst kan du se, at en ny variabel, spy
, er blevet erklæret inden for det grønne lokale omfang.
da variablenroot
er blevet erklæret i det globale omfang, betyder det, at det er tilgængeligt for alt inden for de lilla parenteser, inklusive alt, der er erklæret i det lokale omfang. I den anden blok af kode, kan du se en linje lige under spy variabel erklæring, som bruger root
. Det er tilladt!
uanset hvad der er i det lokale omfang, er det dog ikke tilgængeligt for det globale omfang eller andre lokale kodeblokke. Lad os se på et andet eksempel:
Her har vi tilføjet en anden blok kode, som har sit eget lokale omfang og sin egen variabel, anotherSpy
. Tjek nu den sidste linje i vores spy variabel blok:
System.out.println(anotherSpy); // Error
ser ud som om der er en fejl! Det er fordi det forsøger at bruge anotherSpy
variablen. Men det kan ikke fordi anotherSpy
er hverken inden for det globale omfang eller i samme lokale omfang. Det betyder, at denne blok af kode ikke kan få adgang til den. anotherSpy
er kun tilgængelig i den blok af kode, den er blevet erklæret i.
det samme gælder i den anden retning. Du kan se, at den sidste linje i vores sidste blok kode også har en fejl:
System.out.println(spy); // Error
Her forsøger det at bruge variablen spy fra en anden blok kode. Men det kan ikke siden spy
er ikke i samme omfang som kodeblokken, der forsøger at bruge den.
variabel rækkevidde i klasser
når du erklærer en klasse, gælder de samme generelle regler for scoping: hver variabel er kun tilgængelig inden for dens deklarationsblok. Lad os eksperimentere med en enhjørningsklasse:
ligesom i vores første eksempel er der globale klassevariabler såvel som lokale. Lad os gennemgå i detaljer:
-
variablerne
height
ogpower
er felter i klassen og er tilgængelige overalt i klassen. -
variablen
minutesToSleep
er kun tilgængelig inden for det lokale omfang af den kodeblok, den er erklæret i. -
variablen
minutesToRun
er kun tilgængelig inden for det lokale omfang af den kodeblok, den er erklæret i.
omfanget af en variabel begrænser dens tilgængelighed pr. Klassefelter er dog tilgængelige uden for klassen og kan bruges af enhver anden kodeblok.
i vores eksempel er de height
og power
. Hvis vi erklærer en Enhjørningsvariabel, kan vi læse eller ændre disse værdier:
at være i stand til at rode rundt med klassevariabler kan have alvorlige konsekvenser. Den gode nyhed er – du kan kontrollere det! Før vi tjekker hvordan, skal du sørge for at øve med variabel scoping.
prøv det selv!
adgangskontrol
Vi skal bruge ideen om adgangskontrol ved at implementere begrænset adgang til en klasse, et modul eller en fil. Du ved allerede, hvad en klasse og en fil er, da vi har arbejdet med dem!
et modul er et bundt af relaterede kildefiler, der er knyttet til et navn, som en ramme. En ramme er et sæt funktionaliteter grupperet efter en bestemt kontekst. Det fremskynder udviklingsprocessen og giver vejledning i, hvordan man skriver koden.
der er en række rammer, der leveres af hvert udviklingsmiljø. Faktum er, at implementeringen af disse rammer er langt ud over, hvad de udviklere, der bruger dem, kan se og udnytte. Det gøres ved at begrænse adgangen til detaljerne i implementeringen, også kendt som implementering af adgangskontrol.
kontrolniveauer
i Java skal du bruge et af nøgleordene til at udpege et kontrolniveau:
-
Offentlig: synlig for verden og derfor den mindst restriktive
-
beskyttet: synlig for pakken og alle dens underklasser
-
pakke-beskyttet: typisk kun synlig for den pakke, de er i (standardindstillinger)
-
privat: kun tilgængelig i den sammenhæng, hvori de er defineret (inde i klassen er den placeret)
at sætte disse forskellige begrænsninger på plads gør udviklingen meget lettere. Du behøver ikke bekymre dig om uønsket synlighed af din implementering og mere, uønskede ændringer.
Placer et passende nøgleord foran den relaterede erklæring:
Hvis du prøver at få adgang til private medlemmer uden for klassen, får du fejl:
kontrolniveauerne kan tildeles klasseelementer såvel som klasser:
public class PublicClass {}private class PrivateClass {}
ud over sikkerhed giver angivelse af kontrolniveauer for klassemedlemmer bedre læsbarhed. Når en udvikler klargør en kildefil, er det altid klart, hvilke elementer der kan bruges eksternt.
hierarki af kontrol
et element kan have det samme eller mere restriktive kontrolniveau end dets indeholdende element:
i eksemplet ovenfor erklæres klassen sompublic
. Da klassen er det indeholdende element, betyder det, at alle elementer i denne klasse kan have samme eller mindre eksponeringsniveau. I dette tilfælde omfatter det alle niveauer.
Hvis du erklærer en klasse som private
, kan dens elementer kun være package-private
eller 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() { }}
i eksemplet ovenfor har vi tilføjet en attribut uden en eksplicit adgangskontrol søgeord. I dette scenario antager det som standard niveauet for det indeholdende element. I dette tilfælde er det vores klasse, så det antager niveauet af PrivateClass
.
en klasse på øverste niveau kan ikke markeres privat, men hvis du indstiller den som standard, placeres den i det pakkebeskyttede niveau. Når der erklæres en variabel i en klasse, hvis kontrolniveauet for deklarationskonteksten er højere end klassens, skal variablen også have et eksplicit kontrolniveau. Lad os erklære en filprivateclass variabel:
String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok
som du kan se, hvis standardadgangsniveauet for variabelens kontekst er højere end en klasse, du tildeler den, skal du eksplicit angive variabelens niveau som det samme eller lavere end klassens.
Resume
i dette kapitel har du lært om variabel tilgængelighed:
-
et omfang af en variabel er det kodeområde, hvor det er blevet erklæret.
-
generelt variabelt omfang gælder for alle kodeblokke, inklusive klasser.
-
en anden nødvendig måde at kontrollere adgangen til variabler og funktioner på er at bruge kontrolniveauer: offentlig, beskyttet, pakkebeskyttet og privat.