JavaRush /Блоги Java /Random-TG /Қабулкунанда ва танзимкунанда

Қабулкунанда ва танзимкунанда

Дар гурӯҳ нашр шудааст
Салом! Дар лексияҳои қаблӣ, шумо аллакай омӯхтаед, ки чӣ гуна синфҳои пурраи худро бо соҳаҳо ва усулҳо эҷод кунед. Ин пешрафти ҷиддӣ аст, офарин! Аммо акнун бояд ба шумо як ҳақиқати ногуворро бигӯям. Мо синфҳои худро дуруст ташкил накардаем! Чаро? Дар назари аввал, дар ин синф ягон хатогӣ вуҷуд надорад:
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!");
   }
}
Дар асл, вуҷуд дорад. Тасаввур кунед, ки шумо ҳангоми нишастан дар ҷои кор чунин синф навиштаед Cat, ки гурбаҳоро нишон медиҳад. Ва ӯ ба хона рафт. Ҳангоме ки шумо дар он ҷо будед, як барномасози дигар ба кор омад ва синфи шахсии худро таъсис дод Mainва дар он ҷо синферо, ки шумо навишта будед, истифода бурд Cat.
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Муҳим нест, ки чаро ӯ ин корро кард ва чӣ тавр рӯй дод: шояд шахс хаста шуда бошад ё хоби кофӣ нагирифт. Чизи дигар муҳим аст: синфи кунунии мо Catба шумо имкон медиҳад, ки ба майдонҳо арзишҳои девонаро таъин кунед. Дар натиҷа, барнома дорои an objectҳои дорои ҳолати нодуруст аст, ба монанди ин гурба бо синну соли -1000 сола. Мо ба чӣ хатое роҳ додем? Вақте ки мо синфро эҷод кардем, мо маълумоти онро фош кардем. Майдонҳо nameва дар домени ҷамъиятӣ мебошанд age. weightОнҳоро дар ҳама ҷо дар барнома дастрас кардан мумкин аст: танҳо an object эҷод кунед Cat- ва ин аст, ки ҳар як барномасоз ба маълумоти он мустақиман тавассути оператори " ." дастрасӣ дорад.
Cat cat = new Cat();
cat.name = "";
Дар ин ҷо мо бевосита ба майдон ворид мешавем nameва арзиши онро муқаррар мекунем. Мо бояд бо ягон роҳ маълумоти худро аз дахолати нодурусти беруна муҳофизат кунем. Барои ин чй лозим? Аввалан, ҳама тағирёбандаҳои мисол (майдонҳо) бояд бо тағирдиҳанда ишора карда шаванд private. Private сахттарин тағирдиҳандаи дастрасӣ дар Java мебошад. Агар шумо онро истифода баред, майдонҳои синф Catберун аз он дастрас нестанд.
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 class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";//error! The name field in the Cat class has private access!
   }
}
Компилятор инро мебинад ва дарҳол хато мекунад. Холо киштзорхо гуё мухофизат карда шудаанд. Аммо маълум мешавад, ки дастрасӣ ба онҳо "зиҷ" баста шудааст: агар лозим бошад, барнома ҳатто вазни гурбаи мавҷударо гирифта наметавонад. Ин ҳам имконнопазир аст: дар ин шакл синфи мо истифода бурдан амалан ғайриимкон аст. Идеалӣ, мо бояд ба як намуди дастрасии маҳдуд ба маълумот иҷозат диҳем:
  • Дигар барномасозон бояд an objectҳоро эҷод кунандCat
  • Онҳо бояд маълумотро аз an objectҳои мавҷуда хонда тавонанд (масалан, ном ё синну соли гурбаи аллакай мавҷудбударо гиред)
  • Он ҳамчунин бояд имкони таъин кардани арзишҳои майдон бошад. Аммо дар айни замон - танҳо арзишҳои дуруст. Объектҳои мо бояд аз an objectҳои нодуруст муҳофизат карда шаванд («синну сол = -1000 сол» ва монанди инҳо).
Рӯйхати талабот мувофиқ аст! Аммо дар асл, ҳамаи ин ба осонӣ тавассути усулҳои махсус ба даст оварда мешавад - getters and setters .
Қабулкунандаҳо ва танзимкунандагон - 2
Ин ном аз забони англисии “ get ” - “ receive ” (яъне “метод барои ба даст овардани арзиши майдон”) ва set - “ set ” (яъне “метод барои гузоштани арзиши майдон”) омадааст. Биёед бубинем, ки онҳо бо истифода аз синфи мо ҳамчун намуна чӣ гунаанд Cat:
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) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       this.weight = weight;
   }
}
Тавре ки шумо мебинед, ҳама чиз хеле содда аст :) Номҳои онҳо аксар вақт аз калимаи get/set + номи соҳае, ки барои онҳо масъуланд, иборат аст. Масалан, метод getWeight()арзиши майдони weightan objectеро, ки барои он даъват шуда буд, бармегардонад. Ин аст он чизе ки дар барнома ба назар мерасад:
public class Main {

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 5, 4);
       String barsikName = barsik.getName();
       int barsikAge = barsik.getAge();
       int barsikWeight = barsik.getWeight();

       System.out.println("Cat name: " + barsikName);
       System.out.println("Cat's age: " + barsikAge);
       System.out.println("Weight of the cat: " + barsikWeight);
   }
}
Натиҷаи консол:

Name кота: Барсик
Возраст кота: 5
Вес кота: 4
Ҳоло аз синфи дигар ( Main) ба майдонҳо дастрасӣ дорад Cat, аммо танҳо тавассути гирандагон . Лутфан таваҷҷӯҳ намоед, ки қабулкунандаҳо тағирдиҳандаи дастрасӣ доранд public, яъне онҳо аз ҳар ҷои барнома дастрасанд. Дар бораи таъин кардани арзишҳо чӣ гуфтан мумкин аст? Усулҳои сетер барои ин масъуланд
public void setName(String name) {
   this.name = name;
}
Кори онхо, чи тавре ки мебинед, низ оддй аст. Мо методро setName()дар an object даъват мекунем Cat, онро ҳамчун аргумент сатр мегузорем ва ин сатр ба майдони namean objectи мо таъин карда мешавад.
public class Main {

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 5, 4);

       System.out.println("The original name of the cat is " + barsik.getName());
       barsik.setName("Basil");
       System.out.println("The new name of the cat -" + barsik.getName());
   }
}
Дар ин ҷо мо ҳам гирандагон ва ҳам сеторҳоро истифода мебарем. Аввалан, бо истифода аз гетер, мо номи ибтидоии гурбаро гирифтем ва ба консол баромадем. Сипас, бо истифода аз танзимкунанда nameба майдони он арзиши нав таъин карда шуд - "Васorй". Ва он гоҳ, бо истифода аз гетер, мо боз номро гирифтем, то тафтиш кунем, ки оё он воқеан тағир ёфтааст. Натиҷаи консол:

Изначальное Name кота — Барсик
Новое Name кота — Васorй
Чунин ба назар мерасад, ки фарқият чист? Мо инчунин метавонем ба майдонҳои an object арзишҳои нодуруст таъин кунем, ҳатто агар мо танзимкунанда дошта бошем:
public class Main {

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 5, 4);
       barsik.setAge(-1000);

       System.out.println("Age of Barsik -" + barsik.getAge() + " years");
   }
}
Натиҷаи консол:

Возраст Барсика — -1000 лет
Фарқият дар он аст, ки сетер як усули мукаммал аст . Ва дар як усул, бар хилофи майдон, шумо метавонед мантиқи тафтишро барои пешгирӣ кардани арзишҳои номақбул гузоред. Масалан, шумо метавонед ба осонӣ таъин кардани рақами манфӣ аз рӯи синну солро ғайрифаъол кунед:
public void setAge(int age) {
   if (age >= 0) {
       this.age = age;
   } else {
       System.out.println("Error! Age cannot be negative!");
   }
}
Ва акнун рамзи мо дуруст кор мекунад!
public class Main {

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 5, 4);
       barsik.setAge(-1000);

       System.out.println("Age of Barsik -" + barsik.getAge() + " years");
   }
}
Натиҷаи консол:

Ошибка! Возраст не может быть отрицательным числом!
Возраст Барсика — 5 лет
Дар дохor танзимкунанда маҳдудият мавҷуд аст ва он аз кӯшишҳои муқаррар кардани маълумоти нодуруст муҳофизат мекунад. Синну соли Барсик бетағйир монд. Қабулкунандаҳо ва танзимкунандагон бояд ҳамеша эҷод карда шаванд. Ҳатто агар майдонҳои шумо барои арзишҳои имконпазир маҳдудият надошта бошанд ҳам, аз онҳо ҳеҷ зараре нахоҳад буд. Вазъиятро тасаввур кунед: шумо ва ҳамкасбонатон якҷоя барнома менависед. Шумо синферо Catбо майдонҳои ҷамъиятӣ эҷод кардед ва ҳамаи барномасозон онҳоро мувофиқи хости худ истифода мебаранд. Ва он гоҳ, як рӯзи хубе ба саратон меояд: "Бало, дер ё зуд касе метавонад тасодуфан ба тағирёбанда рақами манфӣ таъин кунад weight! Мо бояд сеторҳоро эҷод кунем ва ҳама майдонҳоро хусусӣ гардонем!” Шумо онҳоро эҷод мекунед ва ҳамаи codeҳои навиштаи ҳамкасбони шумо фавран мешикананд. Дар ниҳоят, онҳо аллакай як қатор code навишта буданд, ки онҳо Catмустақиман ба майдонҳо дастрасӣ доштанд.
cat.name = "Hippopotamus";
Ва ҳоло майдонҳо хусусӣ шудаанд ва компилятор як қатор хатогиҳо медиҳад!
cat.name = "Hippopotamus";//error! The name field of the Cat class has private access!
Дар чунин вазъият аз худи аввал майдонхоро пинхон карда, гетер-сетхо ташкил кардан бехтар мебуд . Ҳамаи ҳамкасбони шумо онҳоро истифода мебурданд ва агар дер фаҳмид, ки шумо бояд арзишҳои майдонро маҳдуд кунед, шумо танҳо чекро дар дохor танзимкунанда илова мекунед. Ва ҳеҷ кас рамзи аллакай навишташударо вайрон намекунад. Албатта, агар шумо хоҳед, ки дастрасии танҳо барои хондан ба як соҳаи муайян, шумо метавонед барои он як қабулкунанда эҷод кунед. "Берунӣ", яъне берун аз синфи шумо танҳо усулҳо бояд дастрас бошанд. Маълумот бояд пинҳон карда шавад.
Қабулкунанда ва танзимкунанда - 4
Бо телефони мобилӣ аналогия кардан мумкин аст. Тасаввур кунед, ки ба ҷои телефони мобorи муқаррарӣ даргиронда, ба шумо телефони қуттии кушода дода шудааст, ки дар он ҳама симҳо, схемаҳо ва ғайра мавҷуданд. баромадан. Телефон кор мекунад: агар шумо сахт кӯшиш кунед ва бо диаграммаҳо машғул шавед, шумо ҳатто метавонед занг занед. Аммо шумо эҳтимол онро вайрон мекунед. Ба ҷои ин, ширкати истеҳсолкунанда ба шумо интерфейс медиҳад: муштарӣ танҳо рақамҳои лозимиро мечинад, тугмаи сабзро бо телефон пахш мекунад ва занг сар мешавад. Ва ба ӯ парвое надорад, ки дар дохor схемаҳо ва симҳо чӣ рӯй дода истодааст ва онҳо вазифаи худро чӣ гуна иҷро мекунанд. Дар ин мисол, ширкат дастрасии маҳдуд ба "дохилӣ" (маълумот) -и телефон дорад ва танҳо интерфейси (усулҳои) берун аз он боқӣ мемонад. Дар натиҷа, муштарӣ он чизеро, ки мехост, ба даст меорад (занг занад) ва бешубҳа дар дохor он чизеро вайрон намекунад.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION