JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ تعمير ڪندڙ

جاوا ۾ تعمير ڪندڙ

گروپ ۾ شايع ٿيل
سلام! اڄ اسان هڪ انتهائي اهم موضوع تي نظر وجهنداسين جيڪو اسان جي شين سان تعلق رکي ٿو. هتي، بغير بغير، اسان اهو چئي سگهون ٿا ته توهان هن علم کي هر روز حقيقي ڪم ۾ استعمال ڪندا! اسان تعمير ڪندڙن بابت ڳالهائينداسين. توهان شايد اهو اصطلاح پهريون ڀيرو ٻڌي رهيا آهيو، پر حقيقت ۾ توهان شايد تعمير ڪندڙ استعمال ڪيو آهي، پر توهان صرف اهو پاڻ کي نوٽيس نه ڪيو آهي :) اسان اهو بعد ۾ ڏسنداسين.

جاوا ۾ هڪ تعمير ڪندڙ ڇا آهي ۽ اهو ڇو ضروري آهي؟

اچو ته ٻه مثال ڏسو.
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

       Car bugatti = new Car();
       bugatti.model = "Bugatti Veyron";
       bugatti.maxSpeed = 407;

   }
}
اسان پنهنجي ڪار ٺاهي ۽ ان جو ماڊل ۽ وڌ ۾ وڌ رفتار مقرر ڪيو. بهرحال، هڪ حقيقي منصوبي ۾، ڪار اعتراض واضح طور تي 2 شعبن کان وڌيڪ هوندي. ۽، مثال طور، 16 شعبا!
public class Car {

   String model;//model
   int maxSpeed;//max speed
   int wheels;// disk width
   double engineVolume;//engine capacity
   String color;//color
   int yearOfIssue;//year of issue
   String ownerFirstName;//Owner's name
   String ownerLastName;//owner's last name
   long price;//price
   boolean isNew;//new or not
   int placesInTheSalon;//number of seats in the cabin
   String salonMaterial;// interior material
   boolean insurance;//is it insured
   String manufacturerCountry;//manufacturer country
   int trunkVolume;// trunk volume
   int accelerationTo100km;//acceleration to 100 km/h in seconds


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "blue";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italy";
       bugatti.ownerFirstName = "Amigo";
       bugatti.yearOfIssue = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.placesInTheSalon = 2;
       bugatti.maxSpeed = 407;
       bugatti.model = "Bugatti Veyron";

   }

}
اسان ھڪڙو نئون ڪار اعتراض ٺاھيو آھي . ھڪڙو مسئلو: اسان وٽ 16 فيلڊ آھن، پر اسان صرف 12 کي شروع ڪيو ! ھاڻي ڪوشش ڪريو ڪوڊ استعمال ڪندي انھن کي ڳولڻ لاءِ جيڪي اسان وساري ويٺا آھيون! ايترو آسان ناهي، صحيح؟ اهڙي صورتحال ۾، پروگرامر آساني سان غلطي ڪري سگهي ٿو ۽ ڪجهه فيلڊ جي شروعات کي ڇڏي ڏيو. نتيجي طور، پروگرام جو رويو غلط ٿي ويندو:
public class Car {

   String model;//model
   int maxSpeed;//max speed
   int wheels;// disk width
   double engineVolume;//engine capacity
   String color;//color
   int yearOfIssue;//year of issue
   String ownerFirstName;//Owner's name
   String ownerLastName;//owner's last name
   long price;//price
   boolean isNew;//new or not
   int placesInTheSalon;//number of seats in the cabin
   String salonMaterial;// interior material
   boolean insurance;//is it insured
   String manufacturerCountry;//manufacturer country
   int trunkVolume;// trunk volume
   int accelerationTo100km;//acceleration to 100 km/h in seconds


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "blue";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italy";
       bugatti.ownerFirstName = "Amigo";
       bugatti.yearOfIssue = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.placesInTheSalon = 2;
       bugatti.maxSpeed = 407;
       bugatti.model = "Bugatti Veyron";

       System.out.println("Model Bugatti Veyron. Engine size - " + bugatti.engineVolume + ", trunk - " + bugatti.trunkVolume + ", salon is made of" + bugatti.salonMaterial +
       ", disc width - " + bugatti.wheels + ". Was acquired in 2018 by Mr. " + bugatti.ownerLastName);

   }

}
ڪنسول آئوٽ:
Bugatti Veyron ماڊل. انجڻ جي بي گھرڻ - 6.3، ٽرنڪ - 0، اندريون نالن مان ٺهيل، رم جي ويڪر - 0. مسٽر نول طرفان 2018 ۾ خريد ڪيو ويو
توهان جو خريدار، جنهن هڪ ڪار لاءِ 2 ملين ڊالر ادا ڪيا، ظاهر آهي ته ”مسٽر نول“ سڏجڻ پسند نه ڪندو! پر سنجيدگيءَ سان، آخر ۾، اسان جو پروگرام هڪ غلط ٺهيل شئي سان ختم ٿي ويو - هڪ ڪار جنهن جي رم جي چوٽي 0 آهي (يعني ڪو به رم ناهي)، هڪ گم ٿيل ٽرن، اڻڄاتل مواد مان ٺهيل اندروني، ۽ اڃا به ڪنهن اڻڄاتل سان تعلق رکي ٿو. . هڪ ئي تصور ڪري سگهي ٿو ته اهڙي غلطي ڪيئن ٿي سگهي ٿي جڏهن پروگرام هلي رهيو آهي! اسان کي اهڙين حالتن کان بچڻ گهرجي. اسان کي اسان جي پروگرام جي ضرورت آهي ته هڪ حد آهي: جڏهن هڪ نئين گاڏي اعتراض ٺاهيندي، مثال طور، ماڊل ۽ وڌ ۾ وڌ رفتار هميشه ان لاء بيان ڪيو وڃي. ٻي صورت ۾، اعتراض ٺاهڻ جي اجازت نه ڏيو. Constructor افعال آساني سان هن ڪم سان منهن ڏيڻ. انهن جو نالو هڪ سبب لاء حاصل ڪيو. ڪنسٽرڪٽر ڪلاس جو هڪ قسم جو ”ڪنڪ“ ٺاهي ٿو، جنهن سان ڪلاس جي هر نئين شئي کي ملندڙ هجڻ گهرجي. سهولت لاءِ، اچو ته ڪار ڪلاس جي هڪ سادي ورزن ڏانهن واپس وڃون ٻن شعبن سان. اسان جي ضرورتن کي ڏنو ويو، ڪار ڪلاس لاء تعمير ڪندڙ هن طرح نظر ايندو:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
۽ هڪ اعتراض ٺاهڻ هاڻي هن وانگر ڏسڻ ۾ اچي ٿو:
public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 407);
}
توجهه ڏيوٺاھيندڙ ڪيئن ٺاھيو ويو آھي. اهو هڪ باقاعده طريقو سان ملندڙ جلندڙ آهي، پر ان ۾ واپسي جو قسم ناهي. انهي حالت ۾، ڪلاس جو نالو تعمير ڪندڙ ۾ اشارو ڪيو ويو آهي، پڻ وڏي خط سان. اسان جي صورت ۾ - ڪار . ان کان علاوه، تعمير ڪندڙ استعمال ڪري ٿو نئون-to-You keyword this . ”هي“ انگريزيءَ ۾ معنيٰ ”هي، هي“. هي لفظ هڪ خاص شئي ڏانهن اشارو ڪري ٿو. ٺاھيندڙ ۾ ڪوڊ:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
تقريبن لفظي ترجمو ڪري سگھجي ٿو: " هن مشين لاءِ ماڊل (جيڪي اسان ھاڻي ٺاھي رھيا آھيون) = ماڊل دليل ، جيڪو ٺاھيندڙ ۾ بيان ڪيو ويو آھي. ھن مشين لاءِ maxSpeed ​​(جيڪو اسان ٺاھي رھيا آھيون) = maxSpeed ​​دليل ، جيڪو تعمير ڪندڙ ۾ بيان ڪيو ويو آهي." اهو ئي ٿيو آهي:
public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car("Bugatti Veyron", 407);
       System.out.println(bugatti.model);
       System.out.println(bugatti.maxSpeed);
   }

}
ڪنسول آئوٽ:
Bugatti Veyron 407
ٺاھيندڙ ڪاميابيءَ سان گھربل قدر مقرر ڪيو. توهان شايد محسوس ڪيو آهي ته هڪ تعمير ڪندڙ باقاعده طريقي سان تمام گهڻو ساڳيو آهي! اهو ڪيئن آهي: هڪ تعمير ڪندڙ هڪ طريقو آهي، صرف ٿورو مخصوص :) صرف هڪ طريقي وانگر، اسان اسان جي تعمير ڪندڙ کي پيرا ميٽرز پاس ڪيو. ۽ صرف هڪ طريقي کي سڏڻ وانگر، هڪ تعمير ڪندڙ کي سڏڻ ڪم نه ڪندو جيڪڏهن توهان انهن جي وضاحت نه ڪندا:
public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car(); //error!
   }

}
توهان ڏسو، ڊزائنر اهو ڪيو جيڪو اسان حاصل ڪرڻ جي ڪوشش ڪري رهيا هئاسين. هاڻي توهان بغير رفتار يا ماڊل جي بغير ڪار ٺاهي نٿا سگهو! ٺاهيندڙن ۽ طريقن جي وچ ۾ هڪجهڙائي اتي ختم نه ٿيندي آهي. بس طريقن وانگر، تعمير ڪندڙن کي اوورلوڊ ڪري سگھجي ٿو. تصور ڪريو ته توھان وٽ گھر ۾ 2 ٻليون آھن. توهان انهن مان هڪ کي ٻلي جي حيثيت ۾ ورتو، ۽ توهان ٻئي کي گهٽي مان بالغ طور تي گهر وٺي آيا ۽ توهان کي خبر ناهي ته هن جي عمر ڪيتري آهي. هن جو مطلب اهو آهي ته اسان جي پروگرام کي ٻن قسمن جي ٻليون ٺاهڻ جي قابل هوندو - پهرين ٻلي لاء نالو ۽ عمر سان، ۽ صرف نالي سان - ٻئي ٻلي لاء. هن کي ڪرڻ لاء، اسان تعمير ڪندڙ کي اوور لوڊ ڪنداسين:
public class Cat {

   String name;
   int age;

   //for the first cat
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   //for the second cat
   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 5);
       Cat streetCatNamedBob = new Cat("Bob");
   }

}
اصل تعمير ڪندڙ کي "نالو" ۽ "عمر" جي پيراگراف سان، اسان هڪ ٻيو شامل ڪيو، صرف نالي سان. اسان گذريل سبقن ۾ ساڳيءَ طرح طريقن کي اوور لوڊ ڪيو. هاڻي اسان ڪاميابيءَ سان ٻلين جا ٻئي ورجن ٺاهي سگهون ٿا :) ڇو تعمير ڪندڙن جي ضرورت آهي؟  - 2ڇا توهان کي ياد آهي ته ليڪچر جي شروعات ۾ اسان چيو هو ته توهان اڳي ئي تعمير ڪندڙ استعمال ڪيا هئا، پر توهان ان تي ڌيان نه ڏنو؟ هي سچ آهي. حقيقت اها آهي ته جاوا ۾ هر طبقي کي هڪ نام نهاد ڊفالٽ تعمير ڪندڙ آهي. ان ۾ ڪو به دليل نه آهي، پر اهو هر وقت باهه ڏئي ٿو جڏهن ڪنهن به طبقي جو ڪو اعتراض پيدا ٿئي ٿو.
public class Cat {

   public static void main(String[] args) {

       Cat barsik = new Cat(); //this is where the default constructor worked
   }
}
پهرين نظر ۾ اهو قابل ذڪر نه آهي. خير، اسان هڪ اعتراض ٺاهيو ۽ ان کي ٺاهيو، ڊزائنر جو ڪم ڪٿي آهي؟ ان کي ڏسڻ لاءِ، اچو ته پنهنجي هٿن سان ڪيٽ ڪلاس لاءِ هڪ خالي ڪنسٽرڪٽر لکون ، ۽ ان جي اندر اسان ڪنسول ۾ ڪجهه جملا پرنٽ ڪنداسين. جيڪڏھن اھو ڏيکاريو ويو آھي، پوء ٺاھيندڙ ڪم ڪيو آھي.
public class Cat {

   public Cat() {
       System.out.println("Created a cat!");
   }

   public static void main(String[] args) {

       Cat barsik = new Cat(); //this is where the default constructor worked
   }
}
ڪنسول آئوٽ:
انهن هڪ ٻلي پيدا ڪيو!
هتي جي تصديق آهي! ڊفالٽ تعمير ڪندڙ هميشه توهان جي ڪلاس ۾ پوشيده طور تي موجود آهي. پر توهان کي ان جي هڪ وڌيڪ خاصيت ڄاڻڻ جي ضرورت آهي. ڊفالٽ تعمير ڪندڙ ڪلاس مان غائب ٿي ويندو آهي جڏهن توهان دليلن سان ڪجهه تعمير ڪندڙ ٺاهيندا آهيو. ان جو ثبوت، حقيقت ۾، اسان اڳ ۾ ئي مٿي ڏٺو آهي. هتي هن ڪوڊ ۾:
public class Cat {

   String name;
   int age;

   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat barsik = new Cat(); //error!
   }
}
اسان نالي ۽ عمر کان سواءِ ٻلي ٺاهي نه سگهياسين ڇاڪاڻ ته اسان Cat : string + number لاءِ هڪ تعمير ڪندڙ جي وضاحت ڪئي آهي. ڊفالٽ تعمير ڪندڙ هن کان فوري طور تي ڪلاس مان غائب ٿي ويو. تنهن ڪري، ياد رکڻ جي پڪ ڪريو: جيڪڏهن توهان کي پنهنجي طبقي ۾ ڪيترن ئي تعمير ڪندڙن جي ضرورت آهي، بشمول هڪ خالي، توهان کي ان کي الڳ الڳ ٺاهڻ جي ضرورت آهي. مثال طور، اسان هڪ پروگرام ٺاهي رهيا آهيون جانورن جي ڪلينڪ لاءِ. اسان جو ڪلينڪ چڱا ڪم ڪرڻ ۽ بي گهر ٻلين جي مدد ڪرڻ چاهي ٿو، جن بابت اسان کي سندن نالو يا عمر جي خبر ناهي. پوء اسان جو ڪوڊ هن طرح ڏسڻ گهرجي:
public class Cat {

   String name;
   int age;

   //for domestic cats
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   //for street cats
   public Cat() {
   }

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 5);
       Cat streetCat = new Cat();
   }
}
هاڻي ته اسان واضح طور تي هڪ ڊفالٽ ڪنسٽرڪٽر لکيو آهي، اسان ٻنهي قسمن جا ڪيٽ ٺاهي سگهون ٿا :) هڪ تعمير ڪندڙ لاءِ (جيئن ڪنهن به طريقي لاءِ)، دليلن جو ترتيب تمام ضروري آهي. اچو ته اسان جي تعمير ڪندڙ ۾ نالو ۽ عمر جي دليلن کي تبديل ڪريون.
public class Cat {

   String name;
   int age;

   public Cat(int age, String name) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 10); //error!
   }
}
غلطي! تعمير ڪندڙ واضح طور تي ٻڌائي ٿو ته جڏهن هڪ ٻلي شئي ٺاهي وئي آهي، ان کي لازمي طور تي هڪ نمبر ۽ اسٽرنگ پاس ڪيو وڃي، انهي ترتيب ۾. ان ڪري اسان جو ڪوڊ ڪم نٿو ڪري. هن کي ياد رکڻ جي پڪ ڪريو ۽ هن کي ذهن ۾ رکو جڏهن توهان جا پنهنجا ڪلاس ٺاهي رهيا آهن:
public Cat(String name, int age) {
   this.name = name;
   this.age = age;
}

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
اهي ٻه مڪمل طور تي مختلف ڊزائنر آهن! جيڪڏهن اسان ان سوال جو جواب بيان ڪريون ٿا ته ”اسان کي ڪنسٽرڪٽر جي ضرورت ڇو آهي؟“ هڪ جملي ۾، اسان چئي سگهون ٿا: ته جيئن شيون هميشه صحيح حالت ۾ هجن. جڏهن توهان تعمير ڪندڙ استعمال ڪندا آهيو، توهان جا سڀئي متغير صحيح طور تي شروع ڪيا ويندا، ۽ پروگرام ۾ رفتار 0 يا ٻيون "غلط" شيون نه هونديون. انهن جو استعمال تمام گهڻو فائدي وارو آهي، سڀ کان پهريان، پروگرامر پاڻ لاء. جيڪڏهن توهان پنهنجي فيلڊ کي شروع ڪيو ٿا، اتي ڪجهه وڃائڻ ۽ غلطي ڪرڻ جو وڏو خطرو آهي. پر اهو هڪ تعمير ڪندڙ سان نه ٿيندو: جيڪڏهن توهان سڀني گهربل دليلن کي پاس نه ڪيو يا انهن جي قسمن کي گڏ ڪيو، مرتب ڪندڙ فوري طور تي هڪ غلطي اڇلائي ڇڏيندو. اهو الڳ الڳ ذڪر ڪرڻ جي قابل آهي ته توهان کي پنهنجي پروگرام جي منطق کي تعمير ڪندڙ جي اندر نه رکڻ گهرجي. هن کي ڪرڻ لاء، توهان وٽ توهان جي اختيار ۾ طريقا آهن جن ۾ توهان بيان ڪري سگهو ٿا سڀني ڪارڪردگي کي توهان جي ضرورت آهي. اچو ته ڏسو ته ڇو تعمير ڪندڙ منطق هڪ خراب خيال آهي:
public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Our car factory is called" + this.name);
   System.out.println("She was founded" + this.age + " years ago" );
   System.out.println("During this time it was produced" + this.carsCount +  "cars");
   System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
}

   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Ford", 115 , 50000000);
   }
}
اسان وٽ ڪار فيڪٽري ڪلاس آهي جيڪو ڪارخانو ٺاهڻ لاءِ ڪارخانو بيان ڪري ٿو. تعمير ڪندڙ جي اندر، اسان سڀني شعبن کي شروع ڪريون ٿا ۽ منطق هتي رکون ٿا: اسان ڪارخاني بابت ڪجهه معلومات ڪنسول ڏانهن ڏيکاريون ٿا. اهو لڳي ٿو ته هن سان ڪو به غلط ناهي، پروگرام مڪمل طور تي ڪم ڪيو. ڪنسول آئوٽ:
اسان جي ڪار ڪارخاني جو نالو فورڊ آهي، جيڪو 115 سال اڳ قائم ٿيو هو، ان عرصي دوران هن 50,000,000 ڪارون پيدا ڪيون آهن، سراسري طور تي هر سال 434,782 ڪارون پيدا ڪري ٿي.
پر حقيقت ۾، اسان هڪ ٽائيم بم لڳايو آهي. ۽ اهڙو ڪوڊ تمام آساني سان غلطين جي ڪري سگھي ٿو. اچو ته تصور ڪريو ته هاڻي اسان فورڊ جي باري ۾ نه ڳالهائي رهيا آهيون، پر نئين ڪارخاني "اميگو موٽر" بابت، جيڪو هڪ سال کان به گهٽ عرصي تائين موجود آهي ۽ 1000 ڪارون ٺاهي چڪو آهي:
public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Our car factory is called" + this.name);
   System.out.println("She was founded" + this.age + " years ago" );
   System.out.println("During this time it was produced" + this.carsCount +  "cars");
   System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
}


   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Amigo Motors", 0 , 1000);
   }
}
ڪنسول آئوٽ:
اسان جي ڪار جي ڪارخاني کي اميگو موٽرز ايڪسيپشن سڏيو ويندو آهي ٿريڊ ۾ "main" java.lang.ArithmeticException: / by zero اهو 0 سال اڳ ٺهرايو ويو هو ان دوران، هن CarFactory ۾ 1000 ڪارون پيدا ڪيون.<init>(CarFactory.java:15) CarFactory.main(CarFactory.java:23) عمل ختم ٿيو ايگزٽ ڪوڊ 1 سان </init>
اسان پهچي ويا آهيون! پروگرام ڪجهه عجيب غلطي سان ختم ٿي ويو. ڇا توهان اندازو لڳائڻ جي ڪوشش ڪندا ته ان جو سبب ڇا آهي؟ سبب اهو منطق آهي جيڪو اسان تعمير ڪندڙ ۾ رکيو آهي. خاص طور تي، هن قطار ۾:
System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
هتي اسان حساب ڪندا آهيون ۽ ڪارخاني جي عمر طرفان پيدا ڪيل ڪارن جي تعداد کي ورهائيندا آهيون. ۽ جيئن ته اسان جو ڪارخانو نئون آهي (يعني اهو 0 سال پراڻو آهي)، نتيجو آهي ورهائڻ 0، جيڪو رياضي ۾ منع ٿيل آهي. نتيجي طور، پروگرام هڪ غلطي سان ختم ٿئي ٿو. اسان کي ڇا ڪرڻ گهرجي ها؟ سڀني منطق کي الڳ طريقي سان منتقل ڪريو ۽ ان کي سڏيو، مثال طور، printFactoryInfo() . توھان ان کي پاس ڪري سگھو ٿا ھڪڙي CarFactory اعتراض ھڪڙي پيٽرولر جي طور تي . توھان پڻ ڪري سگھو ٿا سڀ منطق اتي، ۽ ساڳئي وقت - پروسيسنگ ممڪن غلطيون، اسان وانگر صفر سالن سان. هر هڪ کي پنهنجي. ٺاھڻ جي ضرورت آھي ھڪڙي اعتراض جي حالت کي صحيح طور تي مقرر ڪرڻ لاء. ڪاروباري منطق لاءِ اسان وٽ طريقا آهن. توهان کي هڪ ٻئي سان گڏ نه ڪرڻ گهرجي.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION