JavaRush /Java Blogu /Random-AZ /Modifikatorlara giriş. Şəxsi, qorunan, standart, ictimai

Modifikatorlara giriş. Şəxsi, qorunan, standart, ictimai

Qrupda dərc edilmişdir
Salam! Bugünkü mühazirəmizdə “ giriş dəyişdiriciləri ” anlayışı ilə tanış olacağıq və onlarla işləmək nümunələrinə baxacağıq. Modifikatorlara giriş.  Şəxsi, qorunan, defolt, ictimai - 1"Gəlin tanış olaq" sözü tamamilə doğru olmasa da: siz onların əksəriyyəti ilə əvvəlki mühazirələrdən artıq tanışsınız. Hər halda, gəlin əsas şey haqqında yaddaşımızı təzələyək. Giriş dəyişdiriciləri kodunuzun müxtəlif hissələrinə giriş səviyyəsini tənzimləyən açar sözlərdir. Niyə "ən çox"? Çünki onlardan biri default olaraq təyin edilir və açar sözlə göstərilmir :) Java-da cəmi dörd giriş modifikatoru var. Onları ən sərtdən ən "yumşaq"a qədər sıralayırıq:
  • özəl;
  • qorunan;
  • default (paket görünür);
  • ictimai
Gəlin onların hər birinə baxaq, nə vaxt bizim üçün faydalı ola biləcəklərinə qərar verək və nümunələr verək :)

Şəxsi dəyişdirici

Modifikatorlara giriş.  Şəxsi, qorunan, standart, ictimai - 2Private— ən məhdudlaşdırıcı giriş modifikatoru. Bir sinif daxilində məlumatların və metodların görünməsini məhdudlaşdırır. Siz bu dəyişdiricini alıcılar və tənzimləyicilər haqqında mühazirədən tanıyırsınız. Bu nümunəni xatırlayın?
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;
   }
}
Əvvəlki məqalələrdən birində buna baxdıq. Burada ciddi səhvə yol verdik: məlumatlarımızı açdıq, nəticədə proqramçı həmkarlar sinif sahələrinə birbaşa çıxış əldə etdilər və dəyərlərini dəyişdirdilər. Üstəlik, bu dəyərlər yoxlamalar olmadan təyin edilmişdir, bunun nəticəsində proqramımızda yaşı -1000 il, adı "" və çəkisi 0 olan bir pişik yaratmaq mümkündür. Bu problemi həll etmək üçün biz istifadə edilən alıcılar və tənzimləyicilər , həmçinin dəyişdiricidən istifadə edərək məlumatlara məhdud giriş private.
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) {
       // checking the input parameter
       this.name = name;
   }

   public int getAge() {
       return age;
   }

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

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // checking the input parameter
       this.weight = weight;
   }
}
Əslində, sahələrə girişin məhdudlaşdırılması və alıcı-tənzimləyicilərin tətbiqi real işdə istifadənin ən geniş yayılmış nümunəsidir . private Yəni proqramda inkapsulyasiyanın həyata keçirilməsi bu dəyişdiricinin əsas məqsədidir. Bu, yeri gəlmişkən, təkcə sahələrə aid deyil. Təsəvvür edin ki, proqramınızda çox mürəkkəb funksionallığı həyata keçirən bir üsul var. Bunu misal gətirmək üçün... Tutaq ki, sizin metodunuz readDataFromCollider()verilənləri giriş kimi bir ünvan götürür, Böyük Adron Kollayderindən verilənləri bayt formatında oxuyur, bu məlumatları mətnə ​​çevirir, fayla yazır və çap edir. Metodun təsviri belə ürpertici görünür, kod bir yana qalsın :) Kodun oxunaqlılığını artırmaq üçün metodun mürəkkəb məntiqini bir yerə yazmamaq, əksinə funksionallığı pozmaq yaxşı olardı. ayrı üsullara bölünür. Məsələn, metod məlumatların oxunması, kollayderdən oxunan məlumatların mətnə ​​çevrilməsi, nəticədə əldə edilən mətnin faylda saxlanması və məlumat faylımızın çap edilməsi üçün readByteData()məsuliyyət daşıyır . Metod daha sadə olacaq: convertBytesToSymbols()saveToFile()printColliderData()readDataFromCollider()
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) {

       // convert bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // save the read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // print data from file
   }
}
Bununla belə, interfeyslər haqqında mühazirədən xatırladığınız kimi, istifadəçi yalnız son interfeysə çıxış əldə edir. Bizim 4 metodumuz isə bunun bir hissəsi deyil. Onlar köməkçidir : biz onları kodun oxunuşunu yaxşılaşdırmaq və dörd müxtəlif tapşırığı bir metoda sıxışdırmaqdan qaçmaq üçün yaratdıq. İstifadəçiyə bu üsullara giriş icazəsi verməyə ehtiyac yoxdur. Bir istifadəçinin toqquşdurucu ilə işləyərkən metoda çıxışı varsa convertBytesToSymbols(), o, çox güman ki, bu metodun nə olduğunu və nə üçün lazım olduğunu başa düşməyəcək. Hansı baytlar çevrilir? Onlar haradan gəldilər? Niyə onları mətnə ​​çevirmək olar? Bu metodda işləyən məntiq istifadəçi interfeysinin bir hissəsi deyil. Yalnız metod readDataFromCollider()interfeysin bir hissəsidir. Bu dörd "daxili" üsulla nə etmək lazımdır? Doğru! Modifikatorla onlara girişi məhdudlaşdırın private. Bu yolla onlar öz işlərini sinif daxilində rahatlıqla görə bilir və hər birinin ayrı-ayrılıqda məntiqinə ehtiyacı olmayan istifadəçini çaşdırmazlar.
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) {
       // convert bytes to characters
   }

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

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

Modifikator qorunur

Növbəti ən məhdudlaşdırıcı giriş modifikatoru protected. Modifikatorlara giriş.  Şəxsi, qorunan, defolt, ictimai - 3 Giriş dəyişdiricisi ilə təyin edilmiş sahələr və üsullar protectedgörünəcək:
  • bizimlə eyni paketdə olan bütün siniflər daxilində;
  • sinifimizin bütün davamçı sinifləri daxilində.
Bunun nə vaxt lazım ola biləcəyini təsəvvür etmək dərhal çətindir. Təəccüblənməyin: protectedilə müqayisədə daha az tətbiq halları var privatevə onlar spesifikdir. Təsəvvür edin ki, bizdə hansısa kəşfiyyat orqanının məxfi agentini ifadə edən mücərrəd sinif AbstractSecretAgent, həmçinin top_secretbu sinfi və onun törəmələrini ehtiva edən paket var. Konkret siniflər - FBISecretAgent, MI6SecretAgent, MossadSecretAgentvə s. - ondan miras qalmışdır. Mücərrəd sinif daxilində agent sayğacını tətbiq etmək istəyirik. Proqramın hər hansı bir yerində yeni agent obyekti yaradıldıqda, o, artacaq.
package top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Amma agentlərimiz gizlidir! Bu o deməkdir ki, onların sayı haqqında yalnız onlar və başqa heç kim bilməməlidir. protectedSahəyə asanlıqla dəyişdirici əlavə edə bilərik agentCountvə sonra ya digər gizli agent siniflərinin obyektləri, ya da "gizli" paketimizdə yerləşən siniflər onun dəyərini əldə edə bilər top_secret.
public abstract class AbstractSecretAgent {

   protected static int agentCount = 0;
}
Məhz belə xüsusi tapşırıqlar üçün dəyişdirici lazımdır protected:)

paketin görünən dəyişdiricisi

Siyahımızda daha sonra dəyişdirici defaultvə ya deyildiyi kimi, package visible. O, açar sözlə göstərilmir, çünki Java-da bütün sahələr və metodlar üçün standart olaraq təyin olunur. Əgər kodunuza yazsanız -
int x = 10;
... dəyişən xeyni package visiblegirişə malik olacaq. Metod (və ya dəyişən) hər hansı dəyişdirici ilə işarələnməyibsə, o, "defolt dəyişdirici" ilə işarələnmiş hesab olunur. Belə dəyişdiricisi olan dəyişənlər və ya metodlar (yəni heç biri olmadan) elan olunduğu paketin bütün siniflərinə görünür. Və yalnız onlara. Onun istifadəsi dəyişdirici kimi məhduddur protected. Çox vaxt default-access paketdə istifadə olunur ki, bu paketdəki bütün digər siniflərin funksionallığını həyata keçirməyən bəzi kommunal siniflər var. Bir misal verək. Təsəvvür edin ki, “ xidmətlər ” paketimiz var . Onun daxilində verilənlər bazası ilə işləyən müxtəlif siniflər var. Məsələn, UserServiceverilənlər bazasından istifadəçi məlumatlarını oxuyan sinif, CarServiceeyni verilənlər bazasından avtomobillər haqqında məlumatları oxuyan sinif və hər biri özünəməxsus tipli obyektlərlə işləyən və verilənlər bazasından onlar haqqında məlumatları oxuyan digər siniflər var.
package services;

public class UserService {
}

package services;

public class CarService {
}
Bununla belə, verilənlər bazasındakı məlumatlar bir formatda olduqda vəziyyət asanlıqla baş verə bilər, lakin bizə başqa formatda lazımdır. Təsəvvür edin ki, verilənlər bazasında istifadəçinin doğum tarixi TIMESTAMP WITH TIME ZONE formatında saxlanılır...
2014-04-04 20:32:59.390583+02
...əvəzində bizə ən sadə obyekt lazımdır - java.util.Date. Bu məqsədlə paket daxilində servicesxüsusi bir sinif yarada bilərik Mapper. O, verilənlər bazasından məlumatların bizim tanış olduğumuz Java obyektlərinə çevrilməsinə cavabdeh olacaq. Sadə köməkçi sinif. Biz adətən bütün sinifləri kimi yaradırıq public class ClassName, lakin bu lazım deyil. Biz köməkçi sinifimizi sadəcə olaraq elan edə bilərik class Mapper. Bu halda, o, hələ də öz işini görür, lakin paketdən kənar heç kimə görünmür services!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Və bu, əslində, düzgün məntiqdir: niyə paketdən kənarda kimsə yalnız eyni paketin sinifləri ilə işləyən köməkçi sinif görsün?

ictimai dəyişdirici

Və siyahıda sonuncu, lakin ən azı - dəyişdirici public! Siz onunla JavaRush-da təhsil almağa başlayanda tanış oldunuz public static void main(String[] args). Modifikatorlara giriş.  Şəxsi, qorunan, defolt, ictimai - 4 İndi interfeyslər haqqında mühazirələri öyrəndiyiniz üçün onun məqsədi sizə aydındır :) Axı publico, istifadəçilərə nəsə vermək üçün yaradılıb. Məsələn, proqramınızın interfeysi. Tutaq ki, siz tərcüməçi proqramı yazmısınız və o, rusca mətni ingilis dilinə çevirə bilir. translate(String textInRussian)Lazımi məntiqin həyata keçirildiyi bir üsul yaratdınız . Siz bu metodu sözü ilə qeyd etdiniz publicvə indi o, interfeysin bir hissəsi olacaq:
public class Translator {

   public String translate(String textInRussian) {

       // translates text from Russian to English
   }
}
Proqram ekranındakı "tərcümə et" düyməsi ilə bu metoda zəngi əlaqələndirə bilərsiniz - vəssalam! Hər kəs istifadə edə bilər. Modifikatorla işarələnmiş kodun hissələri publicson istifadəçi üçün nəzərdə tutulub. Həyatdan bir misal gətirək, privatebütün bunlar televizor işləyərkən onun daxilində baş verən proseslərdir və publicbunlar televizorun pultunda istifadəçinin onu idarə edə biləcəyi düymələrdir. Eyni zamanda, o, televizorun necə işlədiyini və necə işlədiyini bilməyə ehtiyac duymur. Pult public- üsullar toplusudur: on(), off(), nextChannel(), previousChannel(), increaseVolume()decreaseVolume()s.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION