JavaRush /Java blogi /Random-UZ /Qabul qiluvchilar va o'rnatuvchilar

Qabul qiluvchilar va o'rnatuvchilar

Guruhda nashr etilgan
Salom! Oldingi ma'ruzalarda siz o'zingizning to'liq huquqli sinflaringizni qanday qilib sohalar va usullar bilan yaratishni o'rgandingiz. Bu jiddiy taraqqiyot, yaxshi! Ammo endi men sizga yoqimsiz haqiqatni aytishim kerak. Biz darslarimizni to'g'ri tashkil qilmadik! Nega? Bir qarashda, bu sinfda hech qanday xatolik yo'q:
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!");
   }
}
Aslida, bor. Tasavvur qiling-a, siz ishda o'tirganingizda Catmushuklarni ko'rsatadigan shunday sinf yozgansiz. Va u uyga ketdi. Siz yo'q bo'lganingizda, boshqa dasturchi ishga keldi va o'z sinfini yaratdi Mainva u erda siz yozgan sinfdan foydalana boshladi Cat.
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Nima uchun buni qilgani yoki qanday sodir bo'lganligi muhim emas: ehtimol, odam charchagan yoki etarlicha uxlamagan. Yana bir narsa muhim: bizning joriy sinfimiz Catmaydonlarga aqldan ozgan qiymatlarni belgilash imkonini beradi. Natijada, dasturda noto'g'ri holatga ega ob'ektlar mavjud, masalan, yoshi -1000 yil bo'lgan bu mushuk. Biz qanday xatoga yo'l qo'ydik? Biz sinfni yaratganimizda, uning ma'lumotlarini oshkor qildik. Maydonlar name, ageva weightumumiy mulkda. Ularga dasturning istalgan joyidan kirish mumkin: shunchaki ob'ekt yarating Cat- va tamom, har qanday dasturchi o'z ma'lumotlariga to'g'ridan-to'g'ri “ .” operatori orqali kirish huquqiga ega.
Cat cat = new Cat();
cat.name = "";
Bu erda biz to'g'ridan-to'g'ri maydonga kiramiz nameva uning qiymatini o'rnatamiz. Biz qandaydir tarzda ma'lumotlarimizni noto'g'ri tashqi aralashuvdan himoya qilishimiz kerak. Buning uchun nima kerak? Birinchidan, barcha misol o'zgaruvchilari (maydonlari) modifikator bilan belgilanishi kerak private. Private Java-dagi eng qattiq kirish modifikatoridir. Agar siz undan foydalansangiz, sinfning maydonlariga Catundan tashqarida kirish imkoni bo'lmaydi.
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!
   }
}
Kompilyator buni ko'radi va darhol xato qiladi. Endi dalalar himoyalanganga o'xshaydi. Ammo ma'lum bo'lishicha, ularga kirish "qattiq" yopiq: dastur, agar kerak bo'lsa, mavjud mushukning vaznini ham ololmaydi. Bu ham variant emas: bu shaklda bizning sinfimizdan foydalanish deyarli mumkin emas. Ideal holda biz ma'lumotlarga qandaydir cheklangan kirishga ruxsat berishimiz kerak:
  • Boshqa dasturchilar ob'ektlar yaratish imkoniyatiga ega bo'lishlari kerakCat
  • Ular allaqachon mavjud ob'ektlardan ma'lumotlarni o'qiy olishlari kerak (masalan, allaqachon mavjud mushukning nomi yoki yoshini oling)
  • Bundan tashqari, maydon qiymatlarini belgilash imkoniyati bo'lishi kerak. Lekin ayni paytda - faqat to'g'ri qiymatlar. Bizning ob'ektlarimiz noto'g'ri narsalardan himoyalangan bo'lishi kerak ("yosh = -1000 yil" va shunga o'xshashlar yo'q).
Talablar ro'yxati munosib! Lekin, aslida, bularning barchasi maxsus usullar yordamida osonlik bilan erishiladi - getters va setters .
Qabul qiluvchilar va o'rnatuvchilar - 2
Ism inglizcha " olish " - " qabul qilish " (ya'ni, "maydon qiymatini olish usuli") va to'siq - " set " (ya'ni, "maydon qiymatini o'rnatish usuli") dan keladi. Keling, bizning sinfimizdan misol sifatida ular qanday ko'rinishini ko'rib chiqaylik 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;
   }
}
Ko'rib turganingizdek, hamma narsa juda oddiy :) Ularning nomlari ko'pincha get/set so'zidan iborat + ular mas'ul bo'lgan maydon nomi. Masalan, usul chaqirilgan ob'ekt uchun getWeight()maydon qiymatini qaytaradi . weightBu dasturda shunday ko'rinadi:
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 chiqishi:

Name кота: Барсик
Возраст кота: 5
Вес кота: 4
Endi boshqa sinfdan ( Main) maydonlarga kirish mumkin Cat, lekin faqat oluvchilar orqali . Iltimos, e'tibor bering, qabul qiluvchilar kirish modifikatoriga ega public, ya'ni ularga dasturning istalgan joyidan kirish mumkin. Qiymatlarni belgilash haqida nima deyish mumkin? Setter usullari bunga javobgardir
public void setName(String name) {
   this.name = name;
}
Ularning ishi, siz ko'rib turganingizdek, oddiy. setName()Biz ob'ekt bo'yicha usulni chaqiramiz , uni argument sifatida qatorga o'tkazamiz va bu satr ob'ektimiz Catmaydoniga tayinlanadi .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 erda biz oluvchilar va o'rnatuvchilardan foydalandik. Birinchidan, oluvchidan foydalanib, biz konsolda mushukning boshlang'ich ismini oldik va ko'rsatdik. Keyin, sozlagich yordamida nameuning maydoniga yangi qiymat tayinlandi - "Vasiliy". Va keyin, oluvchidan foydalanib, biz uning haqiqatan ham o'zgarganligini tekshirish uchun ismni oldik. Konsol chiqishi:

Изначальное Name кота — Барсик
Новое Name кота — Васorй
Ko'rinib turibdiki, farq nima? Shuningdek, bizda sozlashchilar bo'lsa ham, ob'ekt maydonlariga noto'g'ri qiymatlarni belgilashimiz mumkin:
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 chiqishi:

Возраст Барсика — -1000 лет
Farqi shundaki, setter to'liq huquqli usuldir . Va usulda, maydondan farqli o'laroq, qabul qilinishi mumkin bo'lmagan qiymatlarni oldini olish uchun kerak bo'lgan tekshirish mantig'ini kiritishingiz mumkin. Masalan, siz salbiy raqamni yoshga qarab belgilashni osongina o'chirib qo'yishingiz mumkin:
public void setAge(int age) {
   if (age >= 0) {
       this.age = age;
   } else {
       System.out.println("Error! Age cannot be negative!");
   }
}
Va endi bizning kodimiz to'g'ri ishlaydi!
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 chiqishi:

Ошибка! Возраст не может быть отрицательным числом!
Возраст Барсика — 5 лет
Sozlagich ichida cheklov mavjud bo'lib, u noto'g'ri ma'lumotlarni o'rnatishga urinishlardan himoya qiladi. Barsikning yoshi o'zgarishsiz qoldi. Qabul qiluvchilar va sozlagichlar doimo yaratilishi kerak. Sizning maydonlaringiz mumkin bo'lgan qiymatlar bo'yicha hech qanday cheklovlar bo'lmasa ham, ulardan hech qanday zarar bo'lmaydi. Vaziyatni tasavvur qiling: siz va sizning hamkasblaringiz birgalikda dastur yozmoqdasiz. Siz umumiy maydonlar bilan sinf yaratdingiz Catva barcha dasturchilar ulardan o'zlari xohlagancha foydalanadilar. Va keyin bir yaxshi kun sizga shunday tuyuladi: "Jin ursin, ertami-kechmi kimdir tasodifan o'zgaruvchiga salbiy raqam qo'yishi mumkin weight! Biz setterlarni yaratishimiz va barcha maydonlarni shaxsiy qilishimiz kerak!” Siz ularni yaratasiz va hamkasblaringiz tomonidan yozilgan barcha kodlar bir zumda buziladi. Axir, ular allaqachon maydonlarga Catto'g'ridan-to'g'ri kiradigan bir qator kodlarni yozishgan.
cat.name = "Hippopotamus";
Va endi maydonlar shaxsiy bo'lib qoldi va kompilyator bir qator xatolarni ishlab chiqaradi!
cat.name = "Hippopotamus";//error! The name field of the Cat class has private access!
Bunday vaziyatda maydonlarni yashirish va boshidanoq oluvchilarni yaratish yaxshiroqdir . Barcha hamkasblaringiz ulardan foydalanishadi va agar siz maydon qiymatlarini cheklashingiz kerakligini kech anglab etsangiz, shunchaki sozlagichga chek qo'shasiz. Va hech kim allaqachon yozilgan kodni buzmaydi. Albatta, agar siz ma'lum bir maydonga faqat o'qish uchun ruxsat olishni istasangiz, u uchun bitta oluvchi yaratishingiz mumkin. "Tashqarida", ya'ni sinfingizdan tashqarida faqat usullar mavjud bo'lishi kerak. Ma'lumotlar yashirin bo'lishi kerak.
Qabul qiluvchilar va o'rnatuvchilar - 4
Mobil telefon bilan o'xshashlik qilish mumkin. Tasavvur qiling-a, oddiy uyali telefon o'rniga sizga barcha simlar, kontaktlarning zanglashiga olib keladigan va hokazolar joylashgan ochiq korpusli telefon berildi. chiqib ketish. Telefon ishlaydi: agar siz ko'p harakat qilsangiz va diagrammalar bilan shug'ullansangiz, hatto qo'ng'iroq qilishingiz mumkin. Ammo, ehtimol, siz uni buzasiz. Buning o'rniga, ishlab chiqaruvchi kompaniya sizga interfeys beradi: mijoz shunchaki kerakli raqamlarni teradi, telefon bilan yashil tugmani bosadi va qo'ng'iroq boshlanadi. Va u sxemalar va simlar bilan ichkarida nima sodir bo'layotgani va ular o'z vazifalarini qanday bajarishlari haqida qayg'urmaydi. Ushbu misolda kompaniya telefonning "ichki qismlari" ga (ma'lumotlariga) cheklangan kirish huquqiga ega va faqat interfeysni (usullarni) tashqarida qoldirdi. Natijada, mijoz o'zi xohlagan narsani oladi (qo'ng'iroq qiladi) va, albatta, ichida hech narsani buzmaydi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION