Variabel scoping
hver variabel er bare tilgjengelig (og tilgjengelig) i konteksten der den er blitt erklært. For å bestemme konteksten, se de nærmeste åpnings – og lukkemerkene som omgir erklæringen. De fleste programmeringsspråk bruker klammeparenteser ({}
) for å markere begynnelsen og slutten på en blokk med kode. Sjekk ut dette eksemplet:
det er ikke nødvendig å forstå hver bit av koden her; bare fokusere på de krøllete bukseseler. 🙂 Når vi snakker om tilgjengeligheten av en variabel i en kontekst, refererer vi til omfang. Her kan du se at variabelen root
har blitt erklært mellom de to krøllede bøylene sirklet i lilla. Omfanget av den variabelen er alt mellom de to braces.
omfanget av en variabel kan være lokal så vel som global, avhengig av hvor en variabel er deklarert. En global variabel kan være tilgjengelig for alle klasser og metoder i et program, mens en lokal variabel kanskje bare er tilgjengelig innenfor metoden som den er erklært i:
her, vi har utvidet koden litt og utvidet vår første blokk med kode for å inkludere en annen! Hvis du sporer de lilla linjene, kan du se at parentesene fra den første blokken omfatter all koden fra den andre. Deretter kan du se at en ny variabel, spy
, har blitt erklært innenfor det grønne lokale omfanget.
sidenroot
variabelen er deklarert i det globale omfanget, betyr det at den er tilgjengelig for alt i de lilla parentesene, inkludert alt deklarert i det lokale omfanget. I den andre kodeblokken kan du se en linje like under spy variable declaration som bruker root
. Det er tillatt!
det som er i det lokale området, er imidlertid ikke tilgjengelig for det globale omfanget, eller andre lokale kodeblokker. La oss ta en titt på et annet eksempel:
her har vi lagt til en annen blokk med kode, som har sitt eget lokale omfang og sin egen variabel, anotherSpy
. Nå, sjekk ut den siste linjen i vår spy variable blokk:
System.out.println(anotherSpy); // Error
Ser ut som det er en feil! Det er fordi det prøver å bruke variabelen anotherSpy
. Men det kan ikke fordi anotherSpy
ikke er innenfor det globale omfanget eller i samme lokale omfang. Det betyr at denne kodeblokken ikke kan få tilgang til den. anotherSpy
er bare tilgjengelig i kodeblokken den er deklarert i.
det samme gjelder i den andre retningen. Du kan se at den siste linjen i vår siste kodeblokk også har en feil:
System.out.println(spy); // Error
her prøver den å bruke variabelen spion fra en annen kodeblokk. Men det kan ikke siden spy
er ikke i samme omfang som kodeblokken som prøver å bruke den.
Variabelt omfang i klasser
når du deklarerer en klasse, gjelder de samme generelle reglene for omfang: hver variabel er bare tilgjengelig innenfor deklarasjonsblokken. La oss eksperimentere med en enhjørningsklasse:
akkurat som i vårt første eksempel, er det globale klassevariabler så vel som lokale. La oss se nærmere på:
-
variablene
height
ogpower
er felt i klassen og er tilgjengelige hvor som helst i klassen. -
variabelen
minutesToSleep
er bare tilgjengelig innenfor det lokale omfanget av kodeblokken den er deklarert i. -
variabelen
minutesToRun
er bare tilgjengelig innenfor det lokale omfanget av kodeblokken den er deklarert i.
omfanget av en variabel begrenser tilgjengeligheten per definisjon. Klassefelt er imidlertid tilgjengelige utenfor klassen og kan brukes av en hvilken som helst annen kodeblokk.
i vårt eksempel er de height
og power
. Hvis vi erklærer En Enhjørningsvariabel, kan vi lese eller endre disse verdiene: Å kunne rote rundt med klassevariabler kan få alvorlige konsekvenser. Den gode nyheten er – du kan kontrollere det! Før vi sjekke ut hvordan, sørg for å øve med variabel scoping.
Prøv det selv!
Tilgangskontroll
vi skal bruke ideen om tilgangskontroll ved å implementere begrenset tilgang til en klasse, modul eller fil. Du vet allerede hva en klasse og en fil er siden vi har jobbet med dem!
en modul er en samling av relaterte kildefiler knyttet til et navn, som et rammeverk. Et rammeverk er et sett av funksjoner gruppert etter en bestemt kontekst. Det øker utviklingsprosessen og gir veiledning om hvordan man skriver koden.
det finnes en rekke rammer som tilbys av hvert utviklingsmiljø. Faktum er at implementeringen av disse rammene er langt utover hva utviklerne som bruker dem, kan se og utnytte. Det gjøres ved å begrense tilgangen til detaljene for implementering, også kjent som implementering av tilgangskontroll.
Kontrollnivåer
I Java må du bruke ett av søkeordene for å angi et kontrollnivå:
-
Offentlig: synlig for verden og derfor den minst restriktive
-
Beskyttet: synlig for pakken og alle dens underklasser
-
Pakkebeskyttet: Vanligvis bare synlig for pakken de er i (standardinnstillinger)
-
Privat: Bare tilgjengelig i konteksten der de er definert (inne i klassen den er plassert)
Å Sette disse distinkte restriksjonene på plass gjør utviklingen mye enklere. Du trenger ikke å bekymre deg for uønsket synlighet av implementeringen og mer uønskede endringer.
Plasser et passende søkeord foran den relaterte erklæringen:
så, hvis du prøver å få tilgang til private medlemmer fra utenfor klassen, får du feil:
kontrollnivåene kan tilordnes klasseelementer samt klasser:
public class PublicClass {}private class PrivateClass {}
i tillegg til sikkerhet gir spesifisering av kontrollnivåer for klassemedlemmer bedre lesbarhet. Når en utvikler klargjør en kildefil, er det alltid klart hvilke elementer som kan brukes eksternt.
Kontrollhierarki
et element kan ha samme eller mer restriktiv kontrollnivå enn det som inneholder elementet:
i eksemplet ovenfor er klassen erklært sompublic
. Siden klassen er det inneholdende elementet, betyr dette at alle elementer i den klassen kan være av samme eller mindre eksponeringsnivå. I dette tilfellet inkluderer det alle nivåer.
hvis du erklærer en klasse som private
, kan elementene bare 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 lagt til en attributt uten et eksplisitt tilgangskontroll søkeord. I dette scenariet antar det som standard nivået for det inneholdende elementet. I dette tilfellet er det vår klasse, så det antar nivået av PrivateClass
.
en toppklasse kan ikke merkes som privat, men å sette den som standard vil sette den på pakkebeskyttet nivå. Når deklarere en variabel i en klasse, hvis kontrollnivået i deklarasjonskonteksten er høyere enn den i klassen, må variabelen også ha et eksplisitt kontrollnivå. La oss erklære en fileprivateclass variabel:
String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok
Som du kan se, hvis standard tilgangsnivå for variabelens kontekst er høyere enn en klasse du tilordner den, må du eksplisitt angi variabelens nivå som det samme eller lavere enn klassen.
Sammendrag
i dette kapittelet har du lært om variabel tilgjengelighet:
-
et område for en variabel er kodeområdet der den er deklarert.
-
Generelt variabelt omfang gjelder for alle kodeblokker, inkludert klasser.En annen nødvendig måte å kontrollere tilgang til variabler og funksjoner på, er å bruke kontrollnivåer: offentlig, beskyttet, pakkebeskyttet og privat.