CodeGym/Blog Java/Aleatoriu/Modificatori de acces în Java
John Squirrels
Nivel
San Francisco

Modificatori de acces în Java

Publicat în grup
Bună! În lecția de astăzi, ne vom familiariza cu conceptul de modificatori de acces și vom lua în considerare exemple despre cum să lucrăm cu aceștia. Desigur, a spune „fă cunoștință” nu este tocmai corect: ești deja familiarizat cu majoritatea dintre ele din lecțiile anterioare. Pentru orice eventualitate, haideți să ne reîmprospătăm memoria despre cel mai important punct. Accesul modificatorilor sunt cel mai adesea cuvinte cheie care reglementează accesul la diferite părți ale codului dvs. De ce „cel mai des”? Deoarece unul dintre ele este setat implicit fără utilizarea unui cuvânt cheie :) Java are patru modificatori de acces. Le enumerăm în ordine de la cea mai restrictivă la cea mai „îngăduitoare”:
  • privat;
  • implicit (pachet vizibil);
  • protejat;
  • public.
Să aruncăm o privire la fiecare dintre ele și să identificăm când ar putea fi utile. Și vom da exemple :)

Modificatorul privat

Modificatori de acces.  Privat, protejat, implicit, public - 2privat este cel mai restrictiv modificator de acces. Limitează vizibilitatea datelor și metodelor la o singură clasă. Cunoașteți acest modificator din lecția despre getters și setters. Îți amintești acest exemplu?
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Am luat-o în considerare într-o lecție anterioară. Am făcut o greșeală gravă aici: ne facem publice datele, ceea ce a permis colegilor programatori să acceseze direct câmpurile și să le modifice valorile. Mai mult... aceste valori au fost atribuite fără nicio verificare. Aceasta înseamnă că programul nostru ar putea crea o pisică numită „” cu o vârstă de -1000 de ani și o greutate de 0. Pentru a rezolva această problemă, am folosit getters și setters și, de asemenea, am folosit modificatorul privat pentru a limita accesul la date.
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // input parameter check
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // input parameter check
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // input parameter check
       this.weight = weight;
   }
}
Practic, limitarea accesului la câmpuri și implementarea getter-urilor și setterelor sunt cele mai comune exemple de privatizarear fi folosit în munca reală. Cu alte cuvinte, scopul principal al acestui modificator este de a realiza încapsularea într-un program. Apropo, acest lucru nu se aplică numai câmpurilor. Imaginează-ți că în programul tău există o metodă care implementează unele funcționalități FOARTE complexe. Ce putem sugera ca exemplu? Să presupunem că metoda ta readDataFromCollider() acceptă ca intrare o adresă de date, citește datele din Large Hadron Collider în format de octeți, convertește aceste date în text, le scrie într-un fișier și le tipărește. Chiar și o descriere a metodei pare înfricoșătoare, ca să nu mai vorbim despre cod :) Pentru a face codul mai lizibil, cel mai bine ar fi să nu scrieți toată logica complexă a metodei într-un singur loc. În schimb, ar trebui să despărțim funcționalitatea în metode separate. De exemplu, readByteData()metoda este responsabilă pentru citirea datelor, metoda convertBytesToSymbols() convertește datele citite de la colider în text, metoda saveToFile() salvează textul primit într-un fișier, iar metoda printColliderData() imprimă fișierul nostru de date. În cele din urmă, metoda noastră readDataFromCollider() va fi mult mai simplă:
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // Reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // Converts bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // Saves read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // Prints data from the file
   }
}
Cu toate acestea, după cum vă veți aminti din lecția despre interfețe, utilizatorul are acces doar la interfața externă. Și cele 4 metode ale noastre nu fac parte din el. Sunt metode de ajutor: le-am creat pentru a îmbunătăți lizibilitatea codului și pentru a nu înghesui patru sarcini diferite într-o singură metodă. Nu trebuie să oferiți utilizatorului acces la aceste metode. Dacă utilizatorii au acces la metoda convertBytesToSymbols() atunci când lucrează cu coliderul, cel mai probabil ei vor fi pur și simplu confuzi de metodă și se vor întreba pentru ce este. Ce octeți sunt convertiți? De unde au venit? De ce le convertiți în text? Logica executată în această metodă nu face parte din interfața expusă utilizatorului. Numai readDataFromCollider()metoda face parte din interfață. Deci, ce facem cu aceste patru metode „interne”? Dreapta! Utilizați modificatorul privat pentru a limita accesul la acestea. Acest lucru le permite să-și desfășoare munca în mod pașnic în cadrul clasei, fără a deruta utilizatorul, care nu trebuie să cunoască logica fiecărei metode individuale.
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // Reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // Converts bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // Saves read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // Prints data from the file
   }
}

Modificatorul protejat

Următorul modificator cel mai restrictiv este protejat . Modificatori de acces.  Privat, protejat, implicit, public - 3Câmpurile și metodele marcate de modificatorul de acces protejat vor fi vizibile:
  • în cadrul tuturor claselor incluse în același pachet cu al nostru;
  • în cadrul tuturor claselor care moştenesc clasa noastră.
La început, este greu de imaginat când ar putea fi nevoie de acest lucru. Nu fi surprins: există mult mai puține cazuri de utilizare pentru protejat decât pentru privat și sunt foarte specifice. Imaginați-vă că avem o clasă abstractă AbstractSecretAgent care reprezintă un agent secret într-un serviciu de informații, precum și un pachet top_secret care conține această clasă și descendenții ei. Clasele concrete, cum ar fi FBISecretAgent , MI6SecretAgent , MossadSecretAgent etc., îl moștenesc. În cadrul clasei abstracte, dorim să implementăm un contor de agent. Acesta va crește atunci când un agent nou este creat undeva în program. pachet top_secret;
public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Dar agenții noștri sunt secreti! Aceasta înseamnă că ei și nimeni altcineva ar trebui să știe câți dintre ei există. Putem adăuga cu ușurință modificatorul protejat în câmpul agent_counter . Apoi, instanțe ale altor clase de agenți secreti și alte clase situate în pachetul nostru top_secret își pot obține valoarea.
public abstract class AbstractSecretAgent {

   protected static int agent_counter = 0;
}
Și acesta este genul de sarcină specializată care necesită modificatorul protejat :)

Modificatorul vizibil al pachetului

Următorul pe listă este modificatorul implicit , cunoscut și sub numele de modificatorul vizibil al pachetului . Nu este indicat de un cuvânt cheie, deoarece Java îl aplică în mod implicit tuturor câmpurilor și metodelor. Dacă scrieți următoarele în codul dvs.:
int x = 10
variabila x va avea acces vizibil la acest pachet . Este ușor să-ți amintești ce face. Practic, implicit = moștenire protejată :) La fel ca modificatorul protejat , aplicarea sa este limitată. Cel mai adesea, accesul implicit este folosit într-un pachet care are niște clase de utilitate care nu implementează funcționalitatea tuturor celorlalte clase din pachet. Să dăm un exemplu. Imaginați-vă că avem un pachet de „servicii”. Conține diferite clase care funcționează cu o bază de date. De exemplu, există o clasă UserService care citește datele utilizatorului din baza de date, un CarServiceclasă care citește datele auto din aceeași bază de date și alte clase, fiecare dintre ele funcționând cu anumite tipuri de obiecte și citește datele corespunzătoare din baza de date.
package services;

public class UserService {
}

package services;

public class CarService {
}
Dar ar fi ușor ca datele din baza de date să fie într-un format și avem nevoie de ele în altul. Imaginați-vă că datele de naștere ale utilizatorilor în baza de date sunt stocate ca <TIMESTAMP WITH TIME ZONE>...
2014-04-04 20:32:59.390583+02
...și în schimb avem nevoie de cel mai simplu obiect — un java.util.Date . Pentru a rezolva această problemă, în cadrul pachetului de servicii , putem crea o clasă specială Mapper . Acesta va fi responsabil pentru conversia datelor din baza de date în obiectele noastre Java familiare. O clasă simplă de ajutor. De obicei, declarăm toate clasele ca clasă publică ClassName , dar aceasta nu este o cerință. Putem declara clasa noastră de ajutor pur și simplu ca class Mapper . În acest caz, încă își face treaba, dar nu este vizibil pentru nimeni din afara pachetului de servicii !
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Și iată raționamentul de bază: de ce ar trebui cineva din afara unui pachet să vadă o clasă de ajutor care funcționează numai cu clasele din acel pachet?

Modificatorul public

Și nu în ultimul rând, modificatorul public ! Ați întâlnit acest modificator în prima zi de studiu pe CodeGym, prima dată când ați rulat public static void main(String[] args) . Modificatori de acces.  Privat, protejat, implicit, public - 4Acum că ai studiat lecția despre interfețe, scopul ei este evident pentru tine :) La urma urmei, modificatorul public a fost creat pentru a oferi ceva utilizatorilor. De exemplu, interfața programului dvs. Să presupunem că ați scris un program de traducător care poate traduce text rusesc în engleză. Ați creat o metodă translate(String textInRussian) care implementează toată logica necesară. Ai marcat această metodă cu cuvântul public și acum face parte din interfață:
public class Translator {

   public String translate(String textInRussian) {

       // Translates text from Russian to English
   }
}
Puteți lega această metodă la butonul „Traduceți” de pe ecran și ați terminat! Oricine îl poate folosi. Părțile de cod marcate cu modificatorul public sunt destinate utilizatorului final. Oferind un exemplu real, privat este pentru toate procesele care au loc în interiorul unui televizor, dar public este pentru butoanele de pe telecomandă utilizate pentru a gestiona televizorul. În plus, utilizatorul nu trebuie să știe cum este construit televizorul sau cum funcționează. Telecomanda este setul de metode publice : on() , off() , nextChannel() , previousChannel() , increaseVolume() , reduceVolume() etc. Pentru a consolida ceea ce ați învățat, vă sugerăm să urmăriți o lecție video de la Cursul nostru Java
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu