CodeGym /جاوا بلاگ /Random-SD /حاصل ڪندڙ ۽ مقرر ڪندڙ
John Squirrels
سطح
San Francisco

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

گروپ ۾ شايع ٿيل
سلام! پوئين ليڪچرن ۾، توهان اڳ ۾ ئي سکيو آهي ته ڪيئن توهان جي پنهنجي مڪمل ڪلاسن جو اعلان طريقن ۽ شعبن سان ڪيو وڃي. اڄ جي سبق ۾، اسان جاوا ۾ Getters ۽ Setters بابت ڳالهائينداسين. هي سنجيده ترقي آهي، سٺو ڪيو! پر هاڻي مون کي توهان کي هڪ اڻ وڻندڙ ​​سچ ٻڌائڻو آهي. اسان پنهنجي ڪلاسن جو صحيح اعلان نه ڪيو! ڇو؟ پهرين نظر ۾، هيٺين طبقي ۾ ڪا به غلطي ناهي:
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 سال پراڻي آھي). پوءِ اسان پنهنجي ڪلاس جو اعلان ڪندي ڪهڙي غلطي ڪئي؟ اسان پنهنجي ڪلاس جي ڊيٽا کي بي نقاب ڪيو. نالو، عمر ۽ وزن جا شعبا عوامي آھن. انهن کي پروگرام ۾ ڪٿي به رسائي سگهجي ٿو: صرف هڪ Cat اعتراض ٺاهيو ۽ ڪنهن به پروگرامر کي ڊٽ ( . ) آپريٽر ذريعي پنهنجي ڊيٽا تائين سڌو رسائي حاصل ڪري سگهي ٿي.
Cat cat = new Cat();
cat.name = "";
هتي اسان سڌو سنئون نالو فيلڊ تائين رسائي ڪري رهيا آهيون ۽ ان جي قيمت کي ترتيب ڏيو. اسان کي ڪنهن به طرح اسان جي ڊيٽا کي غير مناسب خارجي مداخلت کان بچائڻ جي ضرورت آهي. اسان کي اهو ڪرڻ جي ڪهڙي ضرورت آهي؟ پهريون، سڀ مثال متغير (فيلڊز) کي پرائيويٽ موڊيفائر سان نشان لڳايو وڃي. پرائيويٽ جاوا ۾ سخت ترين رسائي موڊيفائر آهي. هڪ دفعو توهان ائين ڪيو، ٻلي طبقي جا شعبا ڪلاس کان ٻاهر نه پهچندا.
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 Cat class's name field is private!
   }
}
مرتب ڪندڙ هن کي ڏسي ٿو ۽ فوري طور تي هڪ غلطي پيدا ڪري ٿو. هاڻي زمينون محفوظ آهن. پر اهو ظاهر ٿئي ٿو ته اسان رسائي کي بند ڪري ڇڏيو آهي شايد تمام سختي سان: توهان پروگرام ۾ موجود ٻلي جو وزن حاصل نٿا ڪري سگهو، جيتوڻيڪ توهان کي ضرورت هجي. اهو پڻ هڪ اختيار ناهي. جيئن ته اهو آهي، اسان جو طبقو لازمي طور تي ناقابل استعمال آهي. مثالي طور، اسان کي ڪجهه قسم جي محدود رسائي جي اجازت ڏيڻ جي ضرورت آهي:
  • ٻين پروگرامرن کي ٻلي شيون ٺاهڻ جي قابل هجڻ گهرجي
  • انهن کي موجوده شيون مان ڊيٽا پڙهڻ جي قابل هجڻ گهرجي (مثال طور، هڪ موجوده ٻلي جو نالو يا عمر حاصل ڪريو)
  • اهو پڻ ممڪن آهي ته فيلڊ جي قيمتن کي تفويض ڪرڻ لاء. پر ائين ڪرڻ ۾، صرف صحيح قدر جي اجازت ڏني وڃي. اسان جي شين کي غلط قدرن کان محفوظ رکڻ گهرجي (مثال طور عمر = -1000، وغيره).
اها ضرورتن جي هڪ مهذب فهرست آهي! حقيقت ۾، اهو سڀ ڪجهه آساني سان حاصل ڪري سگهجي ٿو خاص طريقن سان جنهن کي گيٽر ۽ سيٽرز سڏيو ويندو آهي.
حاصل ڪندڙ ۽ مقرر ڪندڙ - 2
اهي نالا "حاصل" (يعني "فيلڊ جي قيمت حاصل ڪرڻ جو طريقو") ۽ "سيٽ" (يعني "فيلڊ جي قيمت مقرر ڪرڻ جو طريقو") مان ايندا آهن. اچو ته ڏسو ته اهي اسان جي ڪيٽ ڪلاس ۾ ڪيئن نظر اچن ٿا :
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;
   }
}
جئين توهان ڏسي سگهو ٿا، اهي تمام سادو نظر اچن ٿا :) انهن جا نالا اڪثر "حاصل" / "سيٽ" ۽ لاڳاپيل فيلڊ جو نالو شامل آهن. مثال طور، getWeight() طريقو موٽائي ٿو وزن واري فيلڊ جي قيمت ان شئي لاءِ جنهن تي ان کي سڏيو وڃي ٿو. هتي اهو آهي ته اهو ڪيئن هڪ پروگرام ۾ ڏسڻ ۾ اچي ٿو:
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       String smudgeName = smudge.getName();
       int smudgeAge = smudge.getAge();
       int smudgeWeight = smudge.getWeight();

       System.out.println("Cat's name: " + smudgeName);
       System.out.println("Cat's age: " + smudgeAge);
       System.out.println("Cat's weight: " + smudgeWeight);
   }
}
ڪنسول آئوٽ:
Cat's name: Smudge
Cat's age: 5
Cat's weight: 4
ھاڻي ھڪڙو ٻيو طبقو ( Main ) Cat فيلڊز تائين رسائي ڪري سگھي ٿو، پر صرف حاصل ڪندڙن جي ذريعي. نوٽ ڪريو ته حاصل ڪندڙن وٽ عوامي رسائي جي ترميمي آهي، يعني اهي پروگرام ۾ ڪٿي به موجود آهن. پر قدرن کي تفويض ڪرڻ بابت ڇا؟ اھو اھو آھي جيڪو سيٽر جا طريقا آھن
public void setName(String name) {
   this.name = name;
}
جئين توهان ڏسي سگهو ٿا، اهي پڻ سادي آهن. اسان هڪ Cat اعتراض تي setName() طريقو سڏين ٿا ، هڪ اسٽرنگ کي دليل طور پاس ڪريو، ۽ اسٽرنگ کي اعتراض جي نالي جي فيلڊ ۾ لڳايو ويو آهي.
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);

       System.out.println("Cat's original name: " + smudge.getName());
       smudge.setName("Mr. Smudge");
       System.out.println("Cat's new name: " + smudge.getName());
   }
}
هتي اسان ٻنهي کي استعمال ڪري رهيا آهيون getters ۽ setters. پهرين، اسان حاصل ڪرڻ لاء هڪ گيٽر استعمال ڪندا آهيون ۽ ٻلي جو اصل نالو ڏيکاري ٿو. ان کان پوء، اسان هڪ نئون نالو تفويض ڪرڻ لاء هڪ سيٽر استعمال ڪندا آهيون ("مسٽر اسمج"). ۽ پوء اسان نالو حاصل ڪرڻ لاء هڪ ڀيرو ٻيهر حاصل ڪندڙ استعمال ڪندا آهيون (پڙهڻ لاء ته اهو واقعي تبديل ٿي ويو). ڪنسول آئوٽ:
Cat's original name: Smudge
Cat's new name: Mr. Smudge
پوء ڇا فرق آهي؟ اسان اڃا تائين غلط قدرن کي فيلڊ ۾ تفويض ڪري سگھون ٿا جيتوڻيڪ اسان وٽ سيٽرز آهن:
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
ڪنسول آئوٽ:
Smudge's age: -1000 years
فرق اهو آهي ته هڪ سيٽر هڪ مڪمل طريقو آهي. ۽ هڪ فيلڊ جي برعڪس، هڪ طريقو توهان کي تصديق جي منطق لکڻ جي اجازت ڏئي ٿو جيڪو ناقابل قبول قدرن کي روڪڻ لاء ضروري آهي. مثال طور، توهان آساني سان هڪ منفي نمبر کي عمر جي طور تي مقرر ٿيڻ کان روڪي سگهو ٿا:
public void setAge(int age) {
   if (age >= 0) {
       this.age = age;
   } else {
       System.out.println("Error! Age can't be negative!");
   }
}
۽ هاڻي اسان جو ڪوڊ صحيح ڪم ڪري ٿو!
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
ڪنسول آئوٽ:
Error! Age can't be negative!
Smudge's age: 5 years
سيٽر جي اندر، اسان هڪ پابندي ٺاهي جيڪا اسان کي غلط ڊيٽا سيٽ ڪرڻ جي ڪوشش کان بچايو. سمج جي عمر تبديل نه ڪئي وئي. توهان کي هميشه حاصل ڪندڙ ۽ سيٽرز ٺاهڻ گهرجي. جيتوڻيڪ اتي ڪي به پابنديون نه آهن ته توهان جا شعبا ڪهڙا قدر وٺي سگهن ٿا، اهي مددگار طريقا ڪو به نقصان نه ڏيندا. هيٺين صورتحال جو تصور ڪريو: توهان ۽ توهان جا ساٿي گڏجي هڪ پروگرام لکي رهيا آهيو. توهان عوامي شعبن سان هڪ ٻلي ڪلاس ٺاهي. سڀئي پروگرامر انهن کي استعمال ڪري رهيا آهن جڏهن ته اهي چاهيندا آهن. ۽ پوءِ هڪ سٺو ڏينهن توهان محسوس ڪيو: "غلطي، جلدي يا بعد ۾ ڪو ماڻهو اتفاقي طور تي وزن تي هڪ منفي نمبر تفويض ڪري سگهي ٿو! اسان کي سيٽرز ٺاهڻ ۽ سڀني شعبن کي خانگي بڻائڻ جي ضرورت آهي!" توهان صرف اهو ڪريو، ۽ فوري طور تي توهان جي ساٿين پاران لکيل سڀئي ڪوڊ ٽوڙيو. آخرڪار، انهن اڳ ۾ ئي ڪوڊ جو هڪ گروپ لکيو آهي جيڪو سڌو سنئون ٻلي فيلڊ تائين رسائي ڪري ٿو.
cat.name = "Behemoth";
۽ ھاڻي فيلڊ خانگي آھن ۽ مرتب ڪندڙ غلطين جو ھڪڙو گروپ بيان ڪري ٿو!
cat.name = "Behemoth";//error! The Cat class's name field is private!
انهي حالت ۾، اهو بهتر ٿيندو ته فيلڊ کي لڪايو وڃي ۽ شروعات کان وٺي گيٽر ۽ سيٽرز ٺاهي. توهان جا سڀئي ساٿي انهن کي استعمال ڪن ها. ۽ جيڪڏهن توهان دير سان محسوس ڪيو ته توهان کي ڪنهن حد تائين فيلڊ جي قيمتن کي محدود ڪرڻ جي ضرورت آهي، توهان صرف سيٽٽر اندر چيڪ لکي سگهو ٿا. ۽ ڪو به ڪوڊ ٽوڙيو ويندو. يقينا، جيڪڏهن توهان چاهيو ٿا ته ڪنهن فيلڊ تائين رسائي صرف "پڙهڻ لاءِ" هجي، توهان ان لاءِ صرف هڪ حاصل ڪندڙ ٺاهي سگهو ٿا. صرف طريقن کي ٻاهران دستياب هجڻ گهرجي (يعني توهان جي طبقي کان ٻاهر). ڊيٽا کي لڪايو وڃي. اسان هڪ موبائيل فون سان مقابلو ڪري سگهون ٿا. تصور ڪريو ته عام بند ٿيل موبائيل فون جي بدران، توهان کي هڪ فون ڏنو ويو آهي هڪ کليل ڪيس سان، جنهن ۾ هر قسم جي ڦهليل تار، سرڪٽ وغيره شامل آهن، پر فون ڪم ڪري ٿو: جيڪڏهن توهان تمام گهڻي ڪوشش ڪئي ۽ سرڪٽ کي ڇڪيو، توهان شايد ٿي سگهو ٿا. ڪال ڪرڻ جي قابل. پر توهان شايد ان کي ٽوڙي ڇڏيو.
حاصل ڪندڙ ۽ مقرر ڪندڙ - 3
ان جي بدران، ٺاهيندڙ توهان کي هڪ انٽرفيس ڏئي ٿو: صارف صرف صحيح انگ اکر داخل ڪري ٿو، سائي ڪال بٽڻ کي دٻايو، ۽ ڪال شروع ٿئي ٿي. هن کي پرواه ناهي ته سرڪٽ ۽ تارن سان اندر ڇا ٿئي ٿو، يا اهي پنهنجو ڪم ڪيئن ڪن ٿا. هن مثال ۾، ڪمپني فون جي "اندر" (ڊيٽا) تائين رسائي کي محدود ڪري ٿي ۽ صرف هڪ انٽرفيس (طريقن) کي ظاهر ڪري ٿو. نتيجي طور، صارف حاصل ڪري ٿو جيڪو هوء چاهيو (ڪال ڪرڻ جي صلاحيت) ۽ يقيني طور تي اندر ڪجهه به نه ٽوڙيندو. جيڪو توهان سکيو ان کي مضبوط ڪرڻ لاءِ، اسان توهان کي اسان جي جاوا ڪورس مان هڪ وڊيو سبق ڏسڻ جي صلاح ڏيون ٿا
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION