JavaRush /Java Blog /Random-TK /Java-da gurluşykçylar

Java-da gurluşykçylar

Toparda çap edildi
Salam! Bu gün obýektlerimize degişli gaty möhüm mowzuga serederis. Ynha, ulaltmazdan, bu bilimleri her gün hakyky işde ulanarsyňyz diýip bileris! Gurluşykçylar hakda gürleşeris. Bu termini ilkinji gezek eşidýän bolmagyňyz mümkin, ýöne aslynda konstruktorlary ulanan bolmagyňyz mümkin, ýöne muny özüň duýmadyňyz :) Muny soň göreris.

Java-da konstruktor näme we näme üçin zerur?

Iki mysala seredeliň.
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

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

   }
}
Awtoulagymyzy döretdik we modelini we iň ýokary tizligini kesgitledik. Şeýle-de bolsa, hakyky taslamada Awtoulag obýektiniň 2-den gowrak meýdany boljakdygy aýdyňdyr. Mysal üçin, 16 meýdan!
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";

   }

}
Täze awtoulag obýektini döretdik . Bir mesele: 16 meýdançamyz bar, ýöne diňe 12-ni başladyk ! Nowatdan çykaranlarymyzy tapmak üçin indi kod ulanyp görüň! Gaty aňsat däl, şeýlemi? Şeýle ýagdaýda programmist aňsatlyk bilen ýalňyşlyk goýberip biler we käbir ugurlaryň başlangyjyndan geçip biler. Netijede, programmanyň özüni alyp barşy ýalňyş bolar:
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);

   }

}
Konsol çykyşy:
Bugatti Veyron modeli. Dwigateliň süýşmegi - 6.3, magistral - 0, içerki null, ini ini - 0. 2018-nji ýylda jenap null tarapyndan satyn alyndy
Awtoulag üçin 2 million dollar tölän alyjyňyz, “jenap Null” diýilmegini halamaz! Seriouslyöne çynlakaý, ahyrynda, programmamyz nädogry döredilen bir zat - ini 0 ini bolan awtoulag (ýagny aslynda hiç hili rim ýok), ýiten magistral, näbelli materialdan ýasalan içki we hatda näbelli birine degişlidir. . Programma işleýän wagtynda şeýle ýalňyşlygyň nädip bolup biljekdigini diňe göz öňüne getirip bilersiňiz! Şeýle ýagdaýlardan nädip gaça durmalydyrys. Maksatnamamyzyň çäklendirilmegi zerur: täze ulag serişdesi döredilende, mysal üçin model we iň ýokary tizlik hemişe kesgitlenmeli. Otherwiseogsam, obýekt döretmäge ýol bermäň. Konstruktor funksiýalary bu meseläni aňsatlyk bilen çözýär. Bir sebäbe görä adyny aldylar. Konstruktor synpyň her täze obýektine laýyk gelýän synpyň “skeletini” döredýär. Amatly bolmak üçin, iki meýdanly Awtoulag synpynyň has ýönekeý görnüşine gaýdyp geleliň . Talaplarymyzy göz öňünde tutup, Awtoulag synpynyň konstruktory şeýle bolar:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
Indi bir obýekt döretmek:
public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 407);
}
Üns beriňkonstruktoryň nähili döredilendigi. Adaty usula meňzeýär, ýöne yzyna gaýtarmak görnüşi ýok. Bu ýagdaýda synpyň ady konstruktorda baş harp bilen hem görkezilýär. Biziň ýagdaýymyzda - Awtoulag . Mundan başga-da, konstruktor muny size täze açar söz ulanýar . Iňlis dilinde "bu" "şu, şu" diýmekdir. Bu söz belli bir obýekti aňladýar. Gurluşykdaky kod:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
göçme manyda terjime edilip bilner: " bu enjam üçin model (häzir döredýäris) = konstruktorda görkezilen model argumenti . Bu enjam üçin maxSpeed ​​(biz döredýäris) = maxSpeed ​​argumenti , konstruktorynda görkezilýär. " Bu waka boldy:
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);
   }

}
Konsol çykyşy:
Bugatti Veyron 407
Konstruktor zerur bahalary üstünlikli belledi. Bir konstruktoryň adaty usula gaty meňzeýändigini gören bolmagyňyz mümkin! Ine, şeýle: konstruktor bir usul, diňe azajyk kesgitli :) Bir usuldaky ýaly, parametrleri konstruktorymyza geçirdik. Usuly çagyrmak ýaly, olary görkezmeseňiz, konstruktor çagyrmak işlemez:
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!
   }

}
Görýäňizmi, dizaýner biziň gazanjak bolýan zadymyzy etdi. Indi tizliksiz ýa-da modelsiz awtoulag döredip bolmaz! Gurluşykçylar bilen usullaryň arasyndaky meňzeşlikler bu ýerde gutarmaýar. Usullar ýaly, konstruktorlara aşa ýüklenip bolýar. Öýüňizde 2 pişigiň bardygyny göz öňüne getiriň. Olardan birini pişik hökmünde aldyňyz, ikinjisini bolsa köçeden uly adam hökmünde getirdiňiz we onuň näçe ýaşyndadygyny bilmeýärsiňiz. Bu, biziň programmamyzyň iki pişik üçin - birinji pişigiň ady we ýaşy bilen, diňe bir ady bilen - ikinji pişik üçin döredip biljekdigini aňladýar. Munuň üçin konstruktoryň üstüne ýükläris:
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");
   }

}
Asyl konstruktora “at” we “ýaş” parametrleri bilen başga birini goşduk, diňe at bilen. Öňki sapaklarda edil şonuň ýaly usullary artykmaç ýükledik. Indi pişikleriň iki görnüşini hem üstünlikli döredip bileris :) Gurluşykçylar näme üçin zerur?  - 2leksiýanyň başynda eýýäm konstruktorlary ulandyk diýdik, ýöne duýmadyňyzmy? Bu hakykat. Hakykat, Java-daky her synpda deslapky konstruktor diýilýär. Munuň hiç hili argumenti ýok, ýöne her gezek haýsydyr bir synpyň obýekti döredilende ot alýar.
public class Cat {

   public static void main(String[] args) {

       Cat barsik = new Cat(); //this is where the default constructor worked
   }
}
Bir seretseň bu göze ilmeýär. Bir obýekt döredip, ony döretdik, dizaýneriň işi nirede? Muny görmek üçin geliň, öz ellerimiz bilen Pişik synpy üçin boş konstruktor ýazalyň we onuň içinde konsola käbir sözlemleri çap ederis. Görkezilse, konstruktor işledi.
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
   }
}
Konsol çykyşy:
Pişik döretdiler!
Ine, tassyklama! Adaty konstruktor sapaklaryňyzda elmydama görünmeýär. Emma munuň ýene bir aýratynlygyny bilmeli. Argumentler bilen käbir konstruktor döredeniňizde, deslapky konstruktor synpdan ýitýär. Munuň subutnamasy, aslynda ýokarda gördük. Ine şu kodda:
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!
   }
}
Ady we ýaşy bolmasa pişik döredip bilmedik, sebäbi pişik üçin konstruktor kesgitledik : string + number. Adaty konstruktor şondan soň derrew synpdan ýitdi. Şonuň üçin ýadyňyzdan çykarmaň: synpyňyzda boş gurluşyk ýaly birnäçe konstruktor gerek bolsa, ony aýratyn döretmeli. Mysal üçin, weterinariýa hassahanasy üçin programma döredýäris. Klinikamyz gowy işler etmek we adyny ýa-da ýaşyny bilmeýän öýsüz pişiklere kömek etmek isleýär. Soňra kodumyz şeýle bolmaly:
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();
   }
}
Indi deslapky konstruktory aç-açan ýazanymyzdan soň, iki görnüşli pişik döredip bileris :) Konstruktor üçin (islendik usul ýaly) argumentleriň tertibi gaty möhümdir. Geliň, konstruktorymyzda ady we ýaş argumentlerini çalşalyň.
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!
   }
}
Roralňyşlyk! Gurluşykçy, Pişik obýekti döredilende, bu tertipde san we setirden geçmelidigini aç-açan aýdýar. Şonuň üçin kodumyz işlemeýär. Öz synplaryňyzy döredeniňizde muny ýadyňyzdan çykarmaň we muny ýatda saklaň:
public Cat(String name, int age) {
   this.name = name;
   this.age = age;
}

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Bular düýbünden başga iki dizaýner! “Näme üçin konstruktor gerek?” Diýen soraga bir sözlemde jogap bersek, obýektleriň hemişe dogry ýagdaýda bolmagy üçin aýdyp bileris. Konstruktorlary ulananyňyzda ähli üýtgeýänleriňiz dogry başlar we programmada 0 tizlikli ýa-da beýleki “nädogry” zatlar bolan awtoulaglar bolmaz. Olaryň ulanylyşy, ilkinji nobatda, programmistiň özi üçin gaty peýdaly. Meýdanlary özüňiz başlasaňyz, bir zady ýitirmek we ýalňyşlyk etmek howpy ýokary. Thisöne bu konstruktor bilen bolmaz: eger zerur argumentleriň hemmesine geçmedik bolsaňyz ýa-da olaryň görnüşlerini garyşdyrmadyk bolsaňyz, düzüji derrew ýalňyşlyk goýberer. Programmanyň logikasyny konstruktoryň içine salmaly däldigiňizi aýratyn bellemelidiris. Munuň üçin size zerur ähli funksiýalary suratlandyryp biljek usullaryňyz bar. Konstruktor logikasynyň näme üçin erbet pikirdigine seredeliň:
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);
   }
}
Bizde awtoulag öndürýän zawody suratlandyrýan “CarFactory” synpymyz bar. Konstruktoryň içinde ähli meýdanlary başlaýarys we logikany şu ýere ýerleşdirýäris: zawod hakda käbir maglumatlary konsola görkezýäris. Munuň bilen baglanyşykly ýalňyşlyk ýok ýaly, programma gaty gowy işledi. Konsol çykyşy:
Awtoulag zawodymyz “Ford” diýlip atlandyrylýar 115 ýyl mundan ozal döredilipdi. Bu döwürde 50 000 000 awtoulag öndürdi. Ortaça ýylda 434,782 awtoulag öndürýär.
Emma aslynda wagt bombasyny oturdyk. Şeýle kod aňsatlyk bilen ýalňyşlyklara sebäp bolup biler. Geliň, indi Ford hakda däl-de, bir ýyldan gowrak wagt bäri bar bolan we 1000 awtoulag öndüren täze "Amigo Motors" zawody hakda gürleşeliň:
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);
   }
}
Konsol çykyşy:
Awtoulag fabrigimize "esasy" java.lang.ArithmeticException: / nol boýunça Amigo Motors Exception diýilýär. 0 ýyl ozal esaslandyryldy Bu döwürde CarFactory-da 1000 awtoulag öndürdi. <init> (CarFactory.java:15) CarFactory.main (CarFactory.java:23) Amal 1-nji çykyş kody bilen gutardy </init>
Biz geldik! Programma käbir geň ýalňyşlyk bilen tamamlandy. Munuň sebäbini çaklamaga synanyşarsyňyzmy? Sebäbi konstruktoryň ýerleşdiren logikasy. Has takygy, şu setirde:
System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
Bu ýerde zawodyň ýaşyna görä öndürilen awtoulaglaryň sanyny hasaplaýarys we bölýäris. Zawodymyz täze bolany üçin (ýagny 0 ýaşynda), netijede matematika gadagan edilen 0-a bölünýär. Netijede, programma säwlik bilen gutarýar. Biz näme etmeli? Loghli logikany aýratyn usula geçiriň we oňa mysal üçin printFactoryInfo () diýiň . Parametr hökmünde CarFactory obýektini geçirip bilersiňiz . Şeýle hem, ähli logikany şol ýerde goýup bilersiňiz we şol bir wagtyň özünde - nol ýyl ýaly biziňki ýaly bolup biljek ýalňyşlyklary gaýtadan işlemek. Her kimiň özüne. Obýektiň ýagdaýyny dogry kesgitlemek üçin gurluşykçylar zerur. Iş logikasy üçin usullarymyz bar. Birini beýlekisi bilen garyşdyrmaly däl.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION