JavaRush /Java Blog /Random-TK /Getirýänler we sazlaýjylar

Getirýänler we sazlaýjylar

Toparda çap edildi
Salam! Öňki leksiýalarda meýdanlar we usullar bilen öz doly synplaryňyzy döretmegiň usullaryny öwrendiňiz. Bu çynlakaý öňegidişlik! Nowöne indi saňa ýakymsyz bir hakykaty aýtmaly. Sapaklarymyzy gaty dogry döretmedik! Näme üçin? Bir seretseň, bu synpda ýalňyşlyk ýok:
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!");
   }
}
Aslynda bar. Işde otyrkaňyz, Catpişikleri aňladýan şuňa meňzeş synp ýazandygyňyzy göz öňüne getiriň. Soň bolsa öýüne gitdi. Sen uzakda bolsaň, başga bir programmist işe geldi we öz synpyny döretdi Mainwe şol ýerde seniň ýazan synpyňy ulanyp başlady Cat.
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Munuň näme üçin edilendigi ýa-da nädip bolup geçendigi möhüm däl: belki adam ýadady ýa-da ýeterlik uklamady. Anotherene bir möhüm zat: häzirki synpymyz Catmeýdanlara däli gymmatlyklary bellemäge mümkinçilik berýär. Netijede, programmada -1000 ýaşyndaky bu pişik ýaly nädogry ýagdaýy bolan zatlar bar. Haýsy ýalňyşlyk bilen gutardyk? Synpy döredenimizde, onuň maglumatlaryny paş etdik. Meýdanlar namewe köpçülige açyk age. weightProgrammanyň islendik ýerine girip bolýar: diňe bir obýekt dörediň Cat- we şonuň üçinem islendik programmist öz maglumatlaryna gönüden-göni “ .” ” operatory arkaly girip biler
Cat cat = new Cat();
cat.name = "";
Bu ýerde gönüden-göni meýdana girýäris namewe onuň bahasyny kesgitleýäris. Maglumatlarymyzy nädogry daşarky päsgelçiliklerden goramalydyrys. Munuň üçin näme gerek? Ilki bilen ähli üýtgeýänler (meýdanlar) üýtgediji bilen bellenmeli private. Hususy, Java-da iň berk giriş modifikatory. Ony ulansaňyz, synpyň meýdanlaryna Catonuň daşynda girip bolmaz.
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!
   }
}
Düzediji muny görýär we derrew ýalňyşlyk döredýär. Indi meýdanlar goralýan ýaly. Themöne netijede olara girmek “berk” ýapyk bolýar: zerur bolsa programma hatda bar bolan pişigiň agramyny hem alyp bilmeýär. Bu hem mümkin däl: bu görnüşde synpymyzy ulanmak mümkin däl diýen ýaly. Iň gowusy, maglumatlara haýsydyr bir çäklendirilen girişe rugsat bermeli:
  • Beýleki programmistler obýekt döretmegi başarmalyCat
  • Olar eýýäm bar bolan obýektlerden maglumatlary okamagy başarmalydyrlar (mysal üçin, eýýäm bar bolan pişigiň adyny ýa-da ýaşyny alyň)
  • Meýdanyň bahalaryny bellemek hem mümkin. Emma şol bir wagtyň özünde - diňe dogry bahalar. Obýektlerimiz nädogry zatlardan goralmalydyr (“ýaş = -1000 ýyl” we şuňa meňzeşler ýok).
Talaplaryň sanawy mynasyp! Inöne aslynda bularyň hemmesi ýörite usullar - getterler we sazlaýjylar arkaly aňsatlyk bilen gazanylýar .
Alýanlar we sazlaýjylar - 2
Bu at iňlis dilinden “ almak ” - “ almak ” (ýagny, “meýdanyň bahasyny almak usuly”) we “ set ” ( ýagny , “meýdanyň bahasyny kesgitlemegiň usuly”) sözlerinden gelip çykýar. Mysal hökmünde synpymyzy ulanmagyň nähili bolýandygyny göreliň 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;
   }
}
Görşüňiz ýaly, hemme zat gaty ýönekeý :) Olaryň atlary köplenç get / set + sözlerinden ybarat bolup, jogapkär bolan meýdançanyň adyndan durýar. Mysal üçin, bir usul, çagyrylan obýekt üçin getWeight()meýdanyň bahasyny yzyna gaýtaryp berýär . weightProgrammada şeýle görünýär:
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);
   }
}
Konsol çykyşy:

Name кота: Барсик
Возраст кота: 5
Вес кота: 4
Indi başga bir synpdan ( Main) meýdanlara girip bolýar Cat, ýöne diňe girýänleriň üsti bilen . publicGetirýänleriň programmanyň islendik ýerinden elýeterlidigini aňladýan giriş üýtgedijisiniň bardygyny ýadyňyzdan çykarmaň . Gymmatlyklary bellemek barada näme aýdyp bilersiňiz? Setter usullary munuň üçin jogapkärdir
public void setName(String name) {
   this.name = name;
}
Görşüňiz ýaly, olaryň işi hem ýönekeý. setName()Obýektiň üstünde bir usul diýýäris , argument hökmünde bir setir geçirýäris we bu setir obýektimiziň Catmeýdanyna berilýär .name
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());
   }
}
Bu ýerde hem getterleri, hem sazlaýjylary ulandyk. Ilki bilen getter ulanyp, konsolda pişigiň başlangyç adyny aldyk we görkezdik. Soňra, sazlaýjy ulanyp, nameöz meýdançasyna täze bir baha berildi - “Wasiliý”. Soň bolsa, getter ulanyp, hakykatdanam üýtgändigini ýa-da ýokdugyny barlamak üçin adyny ýene aldyk. Konsol çykyşy:

Изначальное Name кота — Барсик
Новое Name кота — Васorй
Görnüşi ýaly, tapawudy näme? Şeýle hem, sazlaýjylarymyz bar bolsa-da, obýekt meýdanlaryna nädogry bahalary belläp bileris:
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");
   }
}
Konsol çykyşy:

Возраст Барсика — -1000 лет
Tapawut, kesgitleýjiniň doly hukukly usulydyr . Bir usuldan, meýdandan tapawutlylykda, kabul edip bolmajak bahalaryň öňüni almak üçin zerur tassyklama logikasyny goşup bilersiňiz. Mysal üçin, negatiw belgini ýaş hökmünde bellemegi aňsatlyk bilen öçürip bilersiňiz:
public void setAge(int age) {
   if (age >= 0) {
       this.age = age;
   } else {
       System.out.println("Error! Age cannot be negative!");
   }
}
Indi kodumyz dogry işleýär!
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");
   }
}
Konsol çykyşy:

Ошибка! Возраст не может быть отрицательным числом!
Возраст Барсика — 5 лет
Sazlaýjynyň içinde bir çäklendirme bar we ol nädogry maglumatlary bellemek synanyşyklaryndan goraýar. Barsigiň ýaşy üýtgemedi. Alýanlar we sazlaýjylar elmydama döredilmelidir. Ekin meýdanlaryňyzda bolup biljek gymmatlyklara çäklendirmeler bolmasa-da, olardan zyýany bolmaz. Bir ýagdaýy göz öňüne getiriň: siz we kärdeşleriňiz bilelikde programma ýazýarsyňyz. Jemgyýetçilik meýdançalary bilen synp döretdiňiz Catwe ähli programmistler isleýşi ýaly ulanýarlar. Soň bolsa bir gowy gün size başlar: “naramaz, iru-giç kimdir biri üýtgeýjä negatiw san belläp biler weight! Setterleri döretmeli we ähli ugurlary şahsylaşdyrmaly! " Olary döredýärsiňiz we kärdeşleriňiziň ýazan kodlary derrew bozulýar. Galyberse-de, eýýäm meýdanlara gönüden-göni girýän bir topar kod ýazypdylar Cat.
cat.name = "Hippopotamus";
Indi meýdanlar şahsylaşdy we düzüjiler bir topar ýalňyşlyklary çykardy!
cat.name = "Hippopotamus";//error! The name field of the Cat class has private access!
Şeýle ýagdaýda meýdanlary gizläp, ilkibaşdan girdeji gazanýanlary döreden has gowy bolardy . Yourhli kärdeşleriňiz olary ulanardylar we meýdan bahalaryny çäklendirmelidigiňizi giç gören bolsaňyz, sazlaýjynyň içinde çek goşarsyňyz. Hiç kim eýýäm ýazylan kody bozmazdy. Elbetde, belli bir ugra diňe okalýan girmek isleseňiz, munuň üçin bir girdeji gazanyp bilersiňiz. “Daşarda”, ýagny synpyňyzyň daşynda diňe usullar elýeterli bolmaly. Maglumatlar gizlenmeli.
Alýanlar we sazlaýjylar - 4
Analogiýa jübi telefony bilen edilip bilner. Adaty jübi telefonynyň ýerine size ähli simleriň, zynjyrlaryň we ş.m. ýerleşýän açyk gaply telefon berilendigini göz öňüne getiriň. ýapyşmak. Telefon işleýär: diagrammalar bilen gaty synap görseňiz, hatda jaň edip bilersiňiz. Probablyöne, belki, ony bozarsyňyz. Munuň ýerine önümçilik kompaniýasy size interfeýs berýär: müşderi diňe zerur sanlary aýlaýar, telefon bilen ýaşyl düwmä basýar we jaň başlaýar. Zynjyrlar we simler bilen içerde nämeleriň bolup geçýändigi we olaryň işini nädip ýerine ýetirýändigi bilen gyzyklanmaýar. Bu mysalda, kompaniýanyň telefonyň “içerki” (maglumatlary) çäklendirilen ygtyýary bar we daşarda diňe interfeýsi (usullary) galdyrdy. Netijede, müşderi islän zadyny alar (jaň ediň) we içerde hiç zady bozmaz.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION