JavaRush /جاوا بلاگ /Random-SD /حاصل ڪندڙ ۽ مقرر ڪندڙ

حاصل ڪندڙ ۽ مقرر ڪندڙ

گروپ ۾ شايع ٿيل
سلام! پوئين ليڪچرن ۾، توهان اڳ ۾ ئي سکيو آهي ته توهان پنهنجا مڪمل ڪلاس ڪيئن ٺاهيو، فيلڊ ۽ طريقن سان. هي سنجيده ترقي آهي، سٺو ڪيو! پر هاڻي مون کي توهان کي هڪ اڻ وڻندڙ ​​سچ ٻڌائڻو آهي. اسان پنهنجا ڪلاس بلڪل صحيح نه ٺاهيا! ڇو؟ پهرين نظر ۾، هن طبقي ۾ ڪا به غلطيون نه آهن:
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توهان کي اجازت ڏئي ٿو ته چريو قدرن کي فيلڊ ۾ تفويض ڪريو. نتيجي طور، پروگرام ۾ شيون شامل آھن ھڪڙي غلط حالت سان، جھڙوڪ ھي ٻلي -1000 سالن جي عمر سان. آخر اسان ڪهڙي غلطي ڪئي؟ جڏهن اسان ڪلاس ٺاهيو، اسان ان جي ڊيٽا کي ظاهر ڪيو. فيلڊز name، age۽ weightعوامي ڊومين ۾ آهن. انهن کي پروگرام ۾ ڪٿي به رسائي سگهجي ٿو: صرف هڪ اعتراض ٺاهيو Cat- ۽ اهو ئي آهي، ڪنهن به پروگرامر کي سڌو سنئون ان جي ڊيٽا تائين رسائي آهي " ." آپريٽر ذريعي
Cat cat = new Cat();
cat.name = "";
هتي اسان سڌو سنئون فيلڊ تائين رسائي ڪريون ٿا name۽ ان جي قيمت مقرر ڪريو. اسان کي ڪنهن به طرح اسان جي ڊيٽا کي غلط ٻاهران مداخلت کان بچائڻ جي ضرورت آهي. ان لاءِ ڪهڙي ضرورت آهي؟ پهريون، سڀ مثال متغير (شعلن) کي تبديل ڪندڙ سان نشان لڳايو وڃي private. پرائيويٽ جاوا ۾ سخت ترين رسائي موڊيفائر آهي. جيڪڏهن توهان ان کي استعمال ڪندا، ڪلاس جا شعبا 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!
   }
}
مرتب ڪندڙ هن کي ڏسي ٿو ۽ فوري طور تي هڪ غلطي پيدا ڪري ٿو. هاڻي لڳي ٿو ته زمينون محفوظ آهن. پر اهو ظاهر ٿئي ٿو ته انهن تائين رسائي "سخت" بند ٿيل آهي: پروگرام اڃا تائين موجود ٻلي جو وزن به حاصل نٿو ڪري سگهي، جيڪڏهن ضروري هجي. اهو پڻ هڪ اختيار ناهي: هن فارم ۾ اسان جي طبقي کي استعمال ڪرڻ لاء عملي طور تي ناممڪن آهي. مثالي طور اسان کي ڊيٽا تائين ڪجهه قسم جي محدود رسائي جي اجازت ڏيڻ جي ضرورت آهي:
  • ٻيا پروگرامر شيون ٺاهڻ جي قابل هونداCat
  • انهن کي اڳ ۾ ئي موجود شين مان ڊيٽا پڙهڻ جي قابل هجڻ گهرجي (مثال طور، اڳ ۾ ئي موجود ٻلي جو نالو يا عمر حاصل ڪريو)
  • اهو پڻ ممڪن آهي ته فيلڊ جي قيمتن کي تفويض ڪرڻ لاء. پر ساڳئي وقت - صرف صحيح قدر. اسان جي شين کي غلط کان محفوظ رکڻ گهرجي (نه "عمر = -1000 سال" ۽ جهڙوڪ).
ضرورتن جي فهرست مهذب آهي! پر حقيقت ۾، هي سڀ آساني سان خاص طريقن سان حاصل ڪري سگهجي ٿو - getters ۽ setters .
حاصل ڪندڙ ۽ مقرر ڪندڙ - 2
نالو انگريزيءَ مان آيو آهي “ get ” – “ receive ” (يعني “ميٿڊ آف فيلڊ حاصل ڪرڻ جو طريقو”) ۽ سيٽ – “ سيٽ ” (يعني “فيلڊ جي قيمت مقرر ڪرڻ جو طريقو”). اچو ته ڏسو ته اهي اسان جي ڪلاس کي مثال طور استعمال ڪندي نظر اچن ٿا 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()ھڪڙي فيلڊ جي قيمت کي واپس ڏئي ٿو weightاعتراض لاء جنھن لاء اھو سڏيو ويو آھي. اھو اھو آھي جيڪو پروگرام ۾ ڏسڻ ۾ اچي ٿو:
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()اسان ڪنهن شئي تي هڪ طريقو سڏين ٿا Cat، ان کي دليل طور هڪ اسٽرنگ پاس ڪريو، ۽ هي اسٽرنگ 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());
   }
}
هتي اسان ٻنهي حاصل ڪندڙ ۽ سيٽر استعمال ڪيو. پهريون، هڪ گيٽر استعمال ڪندي، اسان وصول ڪيو ۽ ڪنسول ۾ ٻلي جو شروعاتي نالو ڏيکاريو. ان کان پوء، هڪ سيٽر استعمال ڪندي، nameهڪ نئين قيمت ان جي فيلڊ کي لڳايو ويو - "واسيلي". ۽ پوء، هڪ گيٽر استعمال ڪندي، اسان کي ٻيهر نالو مليو ته چيڪ ڪرڻ لاء ته اهو واقعي تبديل ٿي ويو. ڪنسول آئوٽ:

Изначальное Name кота — Барсик
Новое Name кота — Васorй
اهو لڳي ٿو، ڇا فرق آهي؟ اسان پڻ غلط قدر تفويض ڪري سگھون ٿا اعتراض جي فيلڊ ۾، جيتوڻيڪ اسان وٽ سيٽرز آهن:
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 лет
سيٽر اندر هڪ پابندي آهي، ۽ اهو غلط ڊيٽا سيٽ ڪرڻ جي ڪوششن جي خلاف حفاظت ڪري ٿو. بارڪيءَ جي عمر باقي رهي. حاصل ڪرڻ وارا ۽ سيٽرز هميشه پيدا ٿيڻ گهرجن. ايستائين جو توهان جي شعبن ۾ ممڪن قدرن تي ڪا به پابندي ناهي، انهن مان ڪو به نقصان نه ٿيندو. هڪ صورتحال جو تصور ڪريو: توهان ۽ توهان جا ساٿي گڏجي هڪ پروگرام لکي رهيا آهيو. توھان ھڪڙو ڪلاس ٺاھيو Catعوامي شعبن سان، ۽ سڀ پروگرامر انھن کي استعمال ڪن ٿا جيئن اھي چاھين. ۽ پوءِ هڪ سٺو ڏينهن اهو توهان تي اچي ٿو: ”لعنت، جلد يا بعد ۾ ڪو ماڻهو اتفاقي طور تي هڪ منفي نمبر متغير کي تفويض ڪري سگهي ٿو weight! اسان کي سيٽر ٺاهڻ جي ضرورت آهي ۽ سڀني شعبن کي نجي ڪرڻ گهرجي! توھان انھن کي ٺاھيو، ۽ توھان جي ساٿين پاران لکيل سڀئي ڪوڊ فوري طور تي ٽوڙيو. آخرڪار، انهن اڳ ۾ ئي ڪوڊ جو هڪ گروپ لکيو هو جتي اهي Catسڌو سنئون فيلڊ تائين پهچندا هئا.
cat.name = "Hippopotamus";
۽ هاڻي فيلڊ خانگي ٿي چڪا آهن ۽ مرتب ڪندڙ غلطين جو هڪ گروپ پيدا ڪري ٿو!
cat.name = "Hippopotamus";//error! The name field of the Cat class has private access!
اهڙي صورتحال ۾، اهو بهتر ٿيندو ته فيلڊ کي لڪايو وڃي ۽ شروع کان ئي حاصل ڪرڻ وارا پيدا ڪيا وڃن . توهان جا سڀئي ساٿي انهن کي استعمال ڪندا، ۽ جيڪڏهن اهو توهان تي دير ٿي ويو ته توهان کي فيلڊ جي قيمتن کي محدود ڪرڻ جي ضرورت آهي، توهان صرف سيٽٽر اندر هڪ چيڪ شامل ڪندا. ۽ ڪو به اڳ ۾ لکيل ڪوڊ ٽوڙي نه سگهندو. يقينا، جيڪڏھن توھان چاھيو ٿا پڙھڻ لاءِ صرف ھڪڙي خاص فيلڊ تائين رسائي، توھان ٺاھي سگھوٿا ان لاءِ ھڪڙو حاصل ڪندڙ. "ٻاهر"، اهو آهي، توهان جي ڪلاس کان ٻاهر، صرف طريقن کي پهچڻ گهرجي. ڊيٽا کي لڪايو وڃي.
حاصل ڪندڙ ۽ مقرر ڪندڙ - 4
هڪ قياس هڪ موبائل فون سان ڪري سگهجي ٿو. تصور ڪريو ته عام موبائل فون جي بدران، توهان کي هڪ کليل ڪيس سان فون ڏنو ويو آهي، جتي سڀئي تار، سرڪٽ وغيره آهن. ٻاهر نڪرڻ. فون ڪم ڪري ٿو: جيڪڏھن توھان ڪوشش ڪريو ۽ ڊاگرامن سان ڀرپور ڪوشش ڪريو، توھان شايد ڪال ڪري سگھوٿا. پر توهان شايد ان کي ٽوڙي ڇڏيو. ان جي بدران، پيداوار واري ڪمپني توهان کي هڪ انٽرفيس ڏئي ٿي: ڪلائنٽ صرف گهربل نمبر ڊائل ڪري ٿو، هينڊ سيٽ سان سائي بٽڻ کي دٻايو، ۽ ڪال شروع ٿئي ٿي. ۽ هن کي پرواه ناهي ته سرڪٽ ۽ تارن سان اندر ڇا ٿي رهيو آهي ۽ اهي پنهنجو ڪم ڪيئن ڪن ٿا. هن مثال ۾، ڪمپني کي فون جي "اندروني" (ڊيٽا) تائين محدود رسائي آهي ۽ صرف انٽرفيس (طريقن) ٻاهران ڇڏيا آهن. نتيجي طور، ڪلائنٽ حاصل ڪندو جيڪو هن چاهيو (ڪال ڪريو) ۽ يقيني طور تي اندر ڪجهه به نه ٽوڙيندو.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION