JavaRush /Java блогы /Random-KK /Қол жеткізу модификаторлары. Жеке, қорғалған, әдепкі, жал...

Қол жеткізу модификаторлары. Жеке, қорғалған, әдепкі, жалпы

Топта жарияланған
Сәлеметсіз бе! Бүгінгі лекцияда біз « қолжетімділік модификаторлары » түсінігімен танысамыз және олармен жұмыс істеу мысалдарын қарастырамыз. Қол жеткізу модификаторлары.  Жеке, қорғалған, әдепкі, жалпы - 1«Танысайық» деген сөз мүлдем дұрыс болмаса да: сіз олардың көпшілігімен алдыңғы лекциялардан бұрыннан таныссыз. Қалай болғанда да, ең бастысы туралы жадымызды сергітейік. Кіру модификаторлары көбінесе codeтың әртүрлі бөліктеріне қол жеткізу деңгейін реттейтін кілт сөздер болып табылады. Неліктен «көбінесе»? Өйткені олардың біреуі әдепкі бойынша орнатылады және кілт сөзбен көрсетілмейді :) Java тілінде барлығы төрт рұқсат модификаторы бар. Біз оларды ең қаталдан ең «жұмсаққа» қарай ретімен келтіреміз:
  • жеке;
  • қорғалған;
  • әдепкі (бума көрінеді);
  • қоғамдық
Олардың әрқайсысын қарастырайық, олар бізге қашан пайдалы болатынын шешіп, мысалдар келтірейік :)

Модификатор жеке

Қол жеткізу модификаторлары.  Жеке, қорғалған, әдепкі, жалпы - 2Private— қол жеткізудің ең шектеулі модификаторы. Ол бір сынып ішінде деректер мен әдістердің көрінуін шектейді. Сіз бұл модификаторды алушылар мен орнатушылар туралы лекциядан білесіз. Бұл мысал есіңізде ме?
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;
   }
}
Біз оны алдыңғы мақалалардың бірінде қарастырдық. Бұл жерде біз өрескел қателік жібердік: біз деректерімізді аштық, нәтижесінде бағдарламашылар сынып өрістеріне тікелей қол жеткізе алды және олардың мәндерін өзгертті. Сонымен қатар, бұл мәндер тексерусіз тағайындалды, нәтижесінде біздің бағдарламамызда жасы -1000 жыл, аты «» және салмағы 0 болатын мысықты жасауға болады. Бұл мәселені шешу үшін біз пайдаланылған қабылдаушылар мен орнатушылар , сондай-ақ модификаторды пайдалана отырып деректерге шектеулі қол жеткізу 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;
   }
}
Іс жүзінде өрістерге қол жеткізуді шектеу және гетер-сеттерді енгізу privateнақты жұмыста пайдаланудың ең көп таралған мысалы болып табылады. Яғни, бағдарламада инкапсуляцияны жүзеге асыру осы модификатордың негізгі мақсаты болып табылады. Айтпақшы, бұл өрістерге ғана қатысты емес. Сіздің бағдарламаңызда өте күрделі функцияларды жүзеге асыратын әдіс бар екенін елестетіп көріңіз. readDataFromCollider()Мысал ретінде осыны ойлап табу үшін... Сіздің әдісіңіз кіріс ретінде деректері бар мекенжайды алады делік , Үлкен адрон коллайдерінен деректерді byte пішімінде оқиды, бұл деректерді мәтінге түрлендіреді, оны файлға жазады және басып шығарады. Әдістің сипаттамасы тіпті codeты айтпағанда, қорқынышты көрінеді :) Кодтың оқылуын арттыру үшін әдістің күрделі логикасын бір жерде жазбай, керісінше, функционалдылықты бұзған дұрыс. бөлек әдістерге бөлінеді. Мысалы, әдіс readByteData()деректерді оқуға, 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
   }
}
Дегенмен, интерфейстер туралы дәрістен есіңізде болса, пайдаланушы тек соңғы интерфейске қол жеткізе алады. Ал біздің 4 әдісіміз оған кірмейді. Олар көмекші болып табылады : біз оларды codeты оқу мүмкіндігін жақсарту және төрт түрлі тапсырманы бір әдіске біріктірмеу үшін жасадық. Пайдаланушыға бұл әдістерге рұқсат берудің қажеті жоқ. Егер пайдаланушы коллайдермен жұмыс істеу кезінде әдіске қол жеткізе алса convertBytesToSymbols(), ол бұл әдістің не екенін және оның не үшін қажет екенін түсінбеуі мүмкін. Қандай byteтар түрлендіріледі? Олар қайдан келді? Неліктен оларды мәтінге түрлендіру? Бұл әдісте жұмыс істейтін логика пайдаланушы интерфейсінің бөлігі емес. Тек әдіс readDataFromCollider()интерфейстің бөлігі болып табылады. Осы төрт «ішкі» әдіспен не істеу керек? Дұрыс! Модификатормен оларға қол жеткізуді шектеңіз private. Осылайша олар өз жұмысын сынып ішінде оңай орындай алады және олардың әрқайсысының логикасын бөлек қажет етпейтін пайдаланушыны шатастырмайды.
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
   }
}

Модификатор қорғалған

Келесі ең шектеулі қол жеткізу модификаторы болып табылады protected. Қол жеткізу модификаторлары.  Жеке, қорғалған, әдепкі, жалпы – 3 Қол жеткізу модификаторымен белгіленген өрістер мен әдістер protectedкөрінеді:
  • біздікімен бір пакеттегі барлық сыныптарда;
  • біздің сыныбымыздың барлық ізбасар сыныптарында.
Бұл қашан қажет болуы мүмкін екенін елестету бірден қиын. Таң қалмаңыз: protectedқолдану жағдайлары -ға қарағанда әлдеқайда аз privateжәне олар нақты. Бізде AbstractSecretAgentқандай да бір барлау агенттігінің құпия агентін білдіретін абстрактілі класс, сондай-ақ top_secretосы сынып пен оның ұрпақтары бар пакет бар деп елестетіп көріңіз. Одан тұқым қуалайтын нақты кластар - FBISecretAgent, MI6SecretAgent, MossadSecretAgentт.б. Біз дерексіз класс ішінде агент есептегішін іске асырғымыз келеді. Бағдарламаның бір жерінде жаңа агент нысаны жасалғанда, ол артады.
package top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Бірақ біздің агенттер құпия! Бұл олардың саны туралы тек олар ғана және басқа ешкім білуі керек дегенді білдіреді. protectedБіз өріске модификаторды оңай қоса аламыз agentCount, содан кейін басқа құпия агент сыныптарының нысандары немесе біздің «құпия» бумамызда орналасқан сыныптар оның мәнін ала алады top_secret.
public abstract class AbstractSecretAgent {

   protected static int agentCount = 0;
}
Осындай нақты тапсырмалар үшін модификатор қажет protected:)

буманың көрінетін модификаторы

Біздің тізімде келесі модификатор defaultнемесе ол да аталады package visible. Ол кілт сөзбен көрсетілмейді, себебі ол Java тілінде барлық өрістер мен әдістер үшін әдепкі бойынша орнатылған. Егер сіз codeыңызға жазсаңыз -
int x = 10;
... айнымалының xдәл осындай қатынасы болады package visible. Егер әдіс (немесе айнымалы) ешқандай модификатормен белгіленбесе, ол "әдепкі модификатормен" белгіленген болып саналады. Мұндай модификаторы бар айнымалылар немесе әдістер (яғни мүлде жоқ) олар жарияланған пакеттің барлық сыныптарына көрінеді. Және тек оларға. Оның қолданылуы модификатор сияқты шектеулі protected. Көбінесе default-access пакетте пайдаланылады, бұл пакеттегі барлық басқа сыныптардың функционалдығын жүзеге асырмайтын кейбір утorта кластары бар. Мысал келтірейік. Бізде « қызметтер » пакеті бар деп елестетіңіз. Оның ішінде мәліметтер қорымен жұмыс істейтін әртүрлі сыныптар бар. Мысалы, UserServiceдеректер қорынан пайдаланушы деректерін оқитын класс, CarServiceбір дерекқордан автомобильдер туралы мәліметтерді оқитын класс және басқа да класстар бар, олардың әрқайсысы an objectілердің өз типімен жұмыс істейді және олар туралы мәліметтерді дерекқордан оқиды.
package services;

public class UserService {
}

package services;

public class CarService {
}
Дегенмен, дерекқордағы деректер бір пішімде болған кезде жағдай оңай болуы мүмкін, бірақ бізге ол басқа форматта қажет. Дерекқордағы пайдаланушының туған күні TIMESTAMP WITH TIME ZONE форматында сақталғанын елестетіп көріңізші...
2014-04-04 20:32:59.390583+02
...оның орнына бізге ең қарапайым нысан керек - java.util.Date. Осы мақсатта біз бума ішінде servicesарнайы класс жасай аламыз Mapper. Ол дерекқордағы деректерді бізге таныс Java нысандарына түрлендіруге жауапты болады. Қарапайым көмекші сынып. Біз әдетте барлық сыныптарды ретінде жасаймыз public class ClassName, бірақ бұл қажет емес. Біз көмекші сыныбымызды жай ғана деп жариялай аламыз class Mapper. Бұл жағдайда ол әлі де өз жұмысын жасайды, бірақ пакеттен тыс ешкімге көрінбейді services!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Және бұл, шын мәнінде, дұрыс логика: неге пакеттен тыс біреу бір пакеттің сыныптарымен ғана жұмыс істейтін көмекші сыныпты көреді?

қоғамдық модификатор

Және тізімде соңғы, бірақ кем дегенде - модификатор public! Сіз оны JavaRush-те оқудың бірінші күнінде кездестірдіңіз public static void main(String[] args). Қол жеткізу модификаторлары.  Жеке, қорғалған, әдепкі, жалпы – 4 Енді сіз интерфейстер туралы лекцияларды оқып шыққан болсаңыз, оның мақсаты сізге түсінікті :) Өйткені, publicол пайдаланушыларға бір нәрсе беру үшін жасалған. Мысалы, сіздің бағдарламаңыздың интерфейсі. Сіз аудармашы бағдарламасын жаздыңыз делік және ол орыс тіліндегі мәтінді ағылшын тіліне аудара алады. translate(String textInRussian)Сіз қажетті логика орындалатын әдісті жасадыңыз . Сіз бұл әдісті сөзімен белгіледіңіз public, енді ол интерфейстің бөлігі болады:
public class Translator {

   public String translate(String textInRussian) {

       // translates text from Russian to English
   }
}
Сіз бұл әдіске қоңырауды бағдарлама экранындағы «аудару» түймесі арқылы байланыстыра аласыз - және бәрі де! Оны кез келген адам пайдалана алады. Модификатормен белгіленген code бөліктері publicсоңғы пайдаланушыға арналған. Өмірден мысал келтіретін болсақ, privateбұл теледидар жұмыс істеп тұрған кезде оның ішінде болатын барлық процестер және publicбұл пайдаланушы оны басқара алатын теледидардың қашықтан басқару пультіндегі түймелер. Сонымен бірге ол теледидардың қалай жұмыс істейтінін және оның қалай жұмыс істейтінін білудің қажеті жоқ. publicҚашықтан басқару пульті -әдістердің жиынтығы : on(), off(), nextChannel(), previousChannel(), increaseVolume(), decreaseVolume()т.б.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION