JavaRush /Java blogi /Random-UZ /Kirish modifikatorlari. Shaxsiy, himoyalangan, standart, ...

Kirish modifikatorlari. Shaxsiy, himoyalangan, standart, ommaviy

Guruhda nashr etilgan
Salom! Bugungi ma'ruzamizda biz " kirish modifikatorlari " tushunchasi bilan tanishamiz va ular bilan ishlash misollarini ko'rib chiqamiz. Kirish modifikatorlari.  Shaxsiy, himoyalangan, standart, ommaviy - 1Garchi "tanishamiz" so'zi mutlaqo to'g'ri bo'lmasa-da: siz ularning aksariyati bilan oldingi ma'ruzalardan allaqachon tanishsiz. Har holda, keling, asosiy narsa haqida xotiramizni yangilaymiz. Kirish modifikatorlari ko'pincha kodingizning turli qismlariga kirish darajasini tartibga soluvchi kalit so'zlardir. Nima uchun "ko'pincha"? Chunki ulardan biri sukut bo'yicha o'rnatiladi va kalit so'z bilan ko'rsatilmaydi :) Java-da jami to'rtta kirish modifikatori mavjud. Biz ularni eng qat'iydan "yumshoq"gacha tartibda sanab o'tamiz:
  • xususiy;
  • himoyalangan;
  • standart (paket ko'rinadi);
  • ommaviy
Keling, ularning har birini ko'rib chiqaylik, ular bizga qachon foydali bo'lishi mumkinligini aniqlaymiz va misollar keltiramiz :)

Shaxsiy modifikator

Kirish modifikatorlari.  Shaxsiy, himoyalangan, standart, ommaviy - 2Private— eng cheklovchi kirish modifikatori. Bu bitta sinf ichida ma'lumotlar va usullarning ko'rinishini cheklaydi. Siz ushbu modifikatorni oluvchilar va sozlashchilar haqidagi ma'ruzadan bilasiz. Ushbu misolni eslaysizmi?
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;
   }
}
Biz buni oldingi maqolalardan birida ko'rib chiqdik. Bu erda biz jiddiy xatoga yo'l qo'ydik: biz ma'lumotlarimizni ochdik, buning natijasida boshqa dasturchilar sinf maydonlariga to'g'ridan-to'g'ri kirishlari va ularning qiymatlarini o'zgartirishlari mumkin edi. Bundan tashqari, ushbu qiymatlar tekshiruvlarsiz tayinlangan, buning natijasida bizning dasturimizda yoshi -1000 yil, nomi "" va vazni 0 bo'lgan mushukni yaratish mumkin. Ushbu muammoni hal qilish uchun biz ishlatiladigan oluvchilar va sozlagichlar , shuningdek, bir modifikator yordamida ma'lumotlarga cheklangan kirish 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;
   }
}
Darhaqiqat, maydonlarga kirishni cheklash va getters-settersni amalga oshirish haqiqiy ishda foydalanishning eng keng tarqalgan namunasidir . private Ya'ni, dasturda inkapsulyatsiyani amalga oshirish ushbu modifikatorning asosiy maqsadi hisoblanadi. Aytgancha, bu nafaqat maydonlarga tegishli. Tasavvur qiling-a, sizning dasturingizda juda murakkab funksiyalarni amalga oshiradigan usul mavjud. Buni misol qilib keltirish uchun... Aytaylik, sizning usulingiz readDataFromCollider()kirish sifatida ma'lumotlar bilan manzilni oladi, Katta adron kollayderidan ma'lumotlarni bayt formatida o'qiydi, bu ma'lumotlarni matnga aylantiradi, faylga yozadi va chop etadi. Usulning tavsifi ham qo'rqinchli ko'rinadi, kodni qo'ya qolaylik :) Kodning o'qish qobiliyatini oshirish uchun usulning murakkab mantiqini bir joyda yozmaslik, aksincha, funksionallikni buzish yaxshi bo'lardi. alohida usullarga bo'linadi. Masalan, usul ma'lumotlarni o'qish, kollayderdan o'qilgan ma'lumotlarni matnga aylantirish, natijada olingan matnni faylga saqlash va ma'lumotlar faylimizni chop etish readByteData()uchun javobgardir . Usul ancha sodda bo'ladi: 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
   }
}
Biroq, interfeyslar haqidagi ma'ruzadan eslaganingizdek, foydalanuvchi faqat oxirgi interfeysga kirish huquqiga ega bo'ladi. Va bizning 4 usulimiz uning bir qismi emas. Ular yordamchidir : biz ularni kodni o'qish qobiliyatini yaxshilash va to'rt xil vazifani bitta usulga biriktirmaslik uchun yaratdik. Foydalanuvchiga ushbu usullardan foydalanishga ruxsat berishning hojati yo'q. Agar foydalanuvchi kollayder bilan ishlashda ushbu usulga kirish imkoniga ega bo'lsa convertBytesToSymbols(), u bu usul nima ekanligini va nima uchun kerakligini tushunmaydi. Qaysi baytlar aylantiriladi? Ular qayerdan kelgan? Nima uchun ularni matnga aylantirish kerak? Ushbu usulda ishlaydigan mantiq foydalanuvchi interfeysining bir qismi emas. Faqatgina usul readDataFromCollider()interfeysning bir qismidir. Ushbu to'rtta "ichki" usul bilan nima qilish kerak? To'g'ri! Modifikator bilan ularga kirishni cheklang private. Shunday qilib, ular sinf ichida o'z ishlarini osonlikcha bajarishlari va har birining mantig'iga alohida muhtoj bo'lmagan foydalanuvchini chalg'itmasliklari mumkin.
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 himoyalangan

Keyingi eng cheklovchi kirish modifikatori protected. Kirish modifikatorlari.  Shaxsiy, himoyalangan, standart, ommaviy - 3 Kirish modifikatori bilan belgilangan maydonlar va usullar protectedko'rinadi:
  • bizniki bilan bir xil paketdagi barcha sinflar ichida;
  • sinfimizning barcha vorisi sinflari ichida.
Bu qachon kerak bo'lishi mumkinligini darhol tasavvur qilish qiyin. Hayron bo'lmang: protectedga qaraganda kamroq qo'llash holatlari mavjud privateva ular o'ziga xosdir. Tasavvur qiling-a, bizda AbstractSecretAgentba'zi bir razvedka agentligining maxfiy agentini bildiruvchi mavhum sinf, shuningdek, top_secretushbu sinf va uning avlodlarini o'z ichiga olgan paket bor. Undan konkret sinflar - FBISecretAgent, MI6SecretAgent, MossadSecretAgentva hokazolar meros bo'lib qoladi. Mavhum sinf ichida biz agent hisoblagichini joriy qilmoqchimiz. Dasturning biror joyida yangi agent ob'ekti yaratilganda u ko'payadi.
package top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Ammo bizning agentlarimiz sir! Bu ularning soni haqida faqat ular va boshqa hech kim bilishi kerak emasligini anglatadi. protectedBiz maydonga osongina modifikator qo'shishimiz mumkin agentCountva keyin boshqa maxfiy agent sinflari ob'ektlari yoki bizning "maxfiy" paketimizda joylashgan sinflar uning qiymatini olishlari mumkin top_secret.
public abstract class AbstractSecretAgent {

   protected static int agentCount = 0;
}
Aynan shunday aniq vazifalar uchun modifikator kerak protected:)

paket ko'rinadigan modifikator

Keyingi ro'yxatimizda modifikator defaultyoki u ham deyiladi package visible. U kalit so'z bilan ko'rsatilmaydi, chunki u barcha maydonlar va usullar uchun Java-da sukut bo'yicha o'rnatiladi. Agar siz kodingizga yozsangiz -
int x = 10;
... o'zgaruvchi xxuddi shunday ruxsatga ega bo'ladi package visible. Agar usul (yoki o'zgaruvchi) hech qanday modifikator bilan belgilanmagan bo'lsa, u "standart modifikator" bilan belgilangan hisoblanadi. Bunday modifikatorga ega o'zgaruvchilar yoki usullar (ya'ni, umuman bo'lmagan) ular e'lon qilingan paketning barcha sinflariga ko'rinadi. Va faqat ularga. Uning ishlatilishi cheklangan, xuddi modifikator kabi protected. Ko'pincha, default-access paketida foydalaniladi, bu erda ba'zi yordamchi sinflar mavjud bo'lib, ular ushbu paketdagi barcha boshqa sinflarning funksiyalarini amalga oshirmaydi. Keling, misol keltiraylik. Tasavvur qiling, bizda " xizmatlar " to'plami bor. Uning ichida ma'lumotlar bazasi bilan ishlaydigan turli sinflar mavjud. Masalan, UserServicema'lumotlar bazasidan foydalanuvchi ma'lumotlarini o'qiydigan sinf, CarServicebitta ma'lumotlar bazasidan avtomobillar haqidagi ma'lumotlarni o'qiydigan sinf va boshqa sinflar mavjud bo'lib, ularning har biri o'ziga xos turdagi ob'ektlar bilan ishlaydi va ular haqidagi ma'lumotlarni ma'lumotlar bazasidan o'qiydi.
package services;

public class UserService {
}

package services;

public class CarService {
}
Biroq, ma'lumotlar bazasidagi ma'lumotlar bir formatda bo'lsa, vaziyat osonlik bilan sodir bo'lishi mumkin, lekin biz boshqa formatda kerak. Tasavvur qiling, ma’lumotlar bazasida foydalanuvchining tug‘ilgan sanasi TIMESTAMP WITH TIME ZONE formatida saqlanadi...
2014-04-04 20:32:59.390583+02
...o'rniga bizga eng oddiy ob'ekt kerak - java.util.Date. Shu maqsadda paket ichida servicesmaxsus sinf yaratishimiz mumkin Mapper. U ma'lumotlar bazasidagi ma'lumotlarni bizga tanish bo'lgan Java ob'ektlariga aylantirish uchun javobgar bo'ladi. Oddiy yordamchi sinf. Biz odatda barcha sinflarni sifatida yaratamiz public class ClassName, lekin bu shart emas. Biz yordamchi sinfimizni oddiygina deb e'lon qilishimiz mumkin class Mapper. Bunday holda, u hali ham o'z ishini bajaradi, lekin paketdan tashqari hech kimga ko'rinmaydi services!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Va bu, aslida, to'g'ri mantiq: nima uchun paketdan tashqarida kimdir faqat bir xil paket sinflari bilan ishlaydigan yordamchi sinfni ko'radi?

ommaviy modifikator

Va ro'yxatda oxirgi, lekin eng muhimi - modifikator public! Siz u bilan JavaRush-da o'qishning birinchi kunida tanishgansiz public static void main(String[] args). Kirish modifikatorlari.  Shaxsiy, himoyalangan, standart, ommaviy - 4 Endi siz interfeyslar haqidagi ma'ruzalarni o'rganganingizdan so'ng, uning maqsadi sizga ayon bo'ldi :) Axir, publicu foydalanuvchilarga nimadir berish uchun yaratilgan. Masalan, dasturingiz interfeysi. Aytaylik, siz tarjimon dasturini yozdingiz va u rus tilidagi matnni ingliz tiliga tarjima qila oladi. translate(String textInRussian)Siz kerakli mantiq amalga oshiriladigan usul yaratdingiz . Siz ushbu usulni so'z bilan belgiladingiz publicva endi u interfeysning bir qismiga aylanadi:
public class Translator {

   public String translate(String textInRussian) {

       // translates text from Russian to English
   }
}
Siz ushbu usulga qo'ng'iroqni dastur ekranidagi "tarjima" tugmasi bilan bog'lashingiz mumkin - va bu! Har kim undan foydalanishi mumkin. Kodning modifikator bilan belgilangan qismlari publicoxirgi foydalanuvchi uchun mo'ljallangan. Hayotdan misol keltirsak, privatebularning barchasi televizor ishlayotgan vaqtda uning ichida sodir bo'ladigan jarayonlar va publicbular televizorning masofadan boshqarish pultidagi tugmalar bo'lib, foydalanuvchi uni boshqarishi mumkin. Shu bilan birga, u televizorning qanday ishlashini va qanday ishlashini bilishi shart emas. publicMasofadan boshqarish pulti -usullar to'plamidir : on(), off(), nextChannel(), previousChannel(), increaseVolume()va decreaseVolume()hokazo.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION