JavaRush /Java Blog /Random-ID /Konstruktor di Jawa

Konstruktor di Jawa

Dipublikasikan di grup Random-ID
Halo! Hari ini kita akan melihat topik yang sangat penting yang berkaitan dengan objek kita. Di sini, tanpa berlebihan, kami dapat mengatakan bahwa Anda akan menggunakan pengetahuan ini setiap hari dalam pekerjaan nyata! Kita akan berbicara tentang konstruktor. Anda mungkin baru pertama kali mendengar istilah ini, namun sebenarnya Anda mungkin pernah menggunakan konstruktor, tetapi Anda sendiri tidak menyadarinya :) Kita akan melihatnya nanti.

Apa itu konstruktor di Java dan mengapa diperlukan?

Mari kita lihat dua contoh.

public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

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

   }
}
Kami membuat mobil kami dan mengatur model serta kecepatan maksimumnya. Namun dalam proyek sebenarnya, objek Mobil jelas akan memiliki lebih dari 2 bidang. Dan, misalnya, 16 bidang!

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";

   }

}
Kami telah membuat objek Car baru . Satu masalah: kami memiliki 16 bidang, tetapi kami hanya menginisialisasi 12 ! Coba sekarang gunakan kode tersebut untuk menemukan kode yang kita lupa! Tidak semudah itu, bukan? Dalam situasi seperti ini, pemrogram dapat dengan mudah membuat kesalahan dan melewatkan inisialisasi beberapa bidang. Akibatnya, perilaku program akan menjadi salah:

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);

   }

}
Keluaran konsol:
Model Bugatti Veyron. Perpindahan mesin - 6,3, bagasi - 0, interior berbahan null, lebar pelek - 0. Dibeli tahun 2018 oleh Pak null
Pembeli Anda, yang membayar $2 juta untuk sebuah mobil, jelas tidak akan suka dipanggil “Mr. Null”! Tapi serius, pada akhirnya, program kami berakhir dengan objek yang dibuat secara tidak benar - mobil dengan lebar pelek 0 (yaitu, tidak ada pelek sama sekali), bagasi yang hilang, interior yang terbuat dari bahan yang tidak diketahui, dan bahkan milik seseorang yang tidak dikenal. . Kita hanya bisa membayangkan bagaimana kesalahan seperti itu bisa terjadi ketika program sedang berjalan! Kita perlu menghindari situasi seperti itu. Kita membutuhkan program kita untuk memiliki batasan: saat membuat objek kendaraan baru, misalnya, model dan kecepatan maksimum harus selalu ditentukan untuk objek tersebut. Jika tidak, jangan izinkan pembuatan objek. Fungsi konstruktor dengan mudah mengatasi tugas ini. Mereka mendapatkan nama mereka karena suatu alasan. Konstruktor menciptakan semacam "kerangka" kelas, yang harus sesuai dengan setiap objek baru di kelas tersebut. Untuk kenyamanan, mari kita kembali ke versi kelas Mobil yang lebih sederhana dengan dua bidang. Berdasarkan kebutuhan kita, konstruktor untuk kelas Car akan terlihat seperti ini:

public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
Dan membuat objek sekarang terlihat seperti ini:

public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 407);
}
Perhatianbagaimana konstruktor dibuat. Ini mirip dengan metode biasa, tetapi tidak memiliki tipe kembalian. Dalam hal ini, nama kelas ditunjukkan pada konstruktor, juga dengan huruf kapital. Dalam kasus kami - Mobil . Selain itu, konstruktor menggunakan kata kunci new-to-you this . "ini" dalam bahasa Inggris berarti "ini, ini". Kata ini mengacu pada objek tertentu. Kode di konstruktor:

public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
dapat diterjemahkan hampir secara harfiah: " model untuk mesin ini (yang sekarang kita buat) = argumen model , yang ditentukan dalam konstruktor. maxSpeed ​​​​untuk mesin ini (yang kita buat) = argumen maxSpeed ​​, yang ditentukan dalam konstruktor." Inilah yang terjadi:

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);
   }

}
Keluaran konsol:
Bugatti Veyron 407
Konstruktor berhasil menetapkan nilai yang diperlukan. Anda mungkin telah memperhatikan bahwa konstruktor sangat mirip dengan metode biasa! Begitulah adanya: konstruktor adalah sebuah metode, hanya sedikit spesifik :) Sama seperti dalam sebuah metode, kami meneruskan parameter ke konstruktor kami. Dan sama seperti memanggil suatu metode, memanggil konstruktor tidak akan berfungsi jika Anda tidak menentukannya:

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!
   }
  
}
Anda tahu, sang desainer melakukan apa yang ingin kami capai. Sekarang Anda tidak dapat membuat mobil tanpa kecepatan atau tanpa model! Kesamaan antara konstruktor dan metode tidak hanya sampai di situ. Sama seperti metode, konstruktor bisa kelebihan beban. Bayangkan Anda mempunyai 2 kucing di rumah. Anda mengambil salah satu dari mereka saat masih anak kucing, dan Anda membawa pulang yang kedua dari jalan saat sudah dewasa dan Anda tidak tahu persis berapa usianya. Artinya program kita harus bisa membuat dua jenis kucing - dengan nama dan umur untuk kucing pertama, dan hanya dengan nama - untuk kucing kedua. Untuk melakukan ini, kami akan membebani konstruktor:

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");
   }

}
Ke konstruktor asli dengan parameter "nama" dan "usia" kami menambahkan satu lagi, hanya dengan nama. Kami membebani metode dengan cara yang sama di pelajaran sebelumnya. Sekarang kita berhasil membuat kedua versi kucing :) Mengapa konstruktor dibutuhkan?  - 2Apakah Anda ingat di awal kuliah kami mengatakan bahwa Anda telah menggunakan konstruktor, tetapi Anda tidak menyadarinya? Ini benar. Faktanya adalah bahwa setiap kelas di Java memiliki apa yang disebut konstruktor default. Ia tidak memiliki argumen apa pun, tetapi ia aktif setiap kali objek apa pun dari kelas mana pun dibuat.

public class Cat {

   public static void main(String[] args) {

       Cat barsik = new Cat(); //this is where the default constructor worked
   }
}
Sekilas hal ini tidak terlihat. Nah, kita sudah membuat sebuah objek dan menciptakannya, dimanakah karya desainernya? Untuk melihatnya, mari kita tulis konstruktor kosong untuk kelas Cat dengan tangan kita sendiri , dan di dalamnya kita akan mencetak beberapa frase ke konsol. Jika ditampilkan, maka konstruktor telah berfungsi.

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
   }
}
Keluaran konsol:
Mereka menciptakan seekor kucing!
Berikut konfirmasinya! Konstruktor default selalu ada di kelas Anda tanpa terlihat. Namun Anda perlu mengetahui satu fitur lagi. Konstruktor default menghilang dari kelas saat Anda membuat beberapa konstruktor dengan argumen. Buktinya sebenarnya sudah kita lihat di atas. Di sini, di kode ini:

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!
   }
}
Kami tidak dapat membuat kucing tanpa nama dan umur karena kami mendefinisikan konstruktor untuk Cat : string + angka. Konstruktor default menghilang dari kelas segera setelah ini. Oleh karena itu, pastikan untuk mengingat: jika Anda memerlukan beberapa konstruktor di kelas Anda, termasuk yang kosong, Anda perlu membuatnya secara terpisah. Misalnya, kami membuat program untuk klinik hewan. Klinik kami ingin berbuat baik dan membantu kucing tunawisma, yang kami tidak tahu nama atau umurnya. Maka kode kita akan terlihat seperti ini:

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();
   }
}
Sekarang kita telah menulis konstruktor default secara eksplisit, kita dapat membuat kedua jenis kucing :) Untuk konstruktor (seperti halnya metode apa pun), urutan argumen sangat penting. Mari kita tukar argumen name dan age di konstruktor kita.

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!
   }
}
Kesalahan! Konstruktor dengan jelas menyatakan bahwa ketika objek Cat dibuat, ia harus meneruskan nomor dan string, dalam urutan tersebut. Itu sebabnya kode kami tidak berfungsi. Pastikan untuk mengingat hal ini dan ingatlah ini saat membuat kelas Anda sendiri:

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

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Ini adalah dua desainer yang sangat berbeda! Jika kita mengungkapkan jawaban atas pertanyaan “Mengapa kita memerlukan konstruktor?” dalam satu kalimat, kita dapat mengatakan: agar objek selalu dalam keadaan yang benar. Saat Anda menggunakan konstruktor, semua variabel Anda akan diinisialisasi dengan benar, dan tidak akan ada mobil dengan kecepatan 0 atau objek “salah” lainnya dalam program. Penggunaannya sangat bermanfaat, pertama-tama, bagi programmer itu sendiri. Jika Anda menginisialisasi kolom sendiri, ada risiko besar kehilangan sesuatu dan membuat kesalahan. Namun hal ini tidak akan terjadi pada konstruktor: jika Anda tidak meneruskan semua argumen yang diperlukan ke dalamnya atau mencampuradukkan tipenya, kompiler akan segera membuat kesalahan. Perlu disebutkan secara terpisah bahwa Anda tidak boleh memasukkan logika program Anda ke dalam konstruktor. Untuk melakukan ini, Anda memiliki metode yang dapat Anda gunakan untuk menjelaskan semua fungsi yang Anda perlukan. Mari kita lihat mengapa logika konstruktor adalah ide yang buruk:

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);
   }
}
Kami memiliki kelas CarFactory yang menggambarkan pabrik untuk memproduksi mobil. Di dalam konstruktor, kami menginisialisasi semua bidang dan menempatkan logika di sini: kami menampilkan beberapa informasi tentang pabrik ke konsol. Tampaknya tidak ada yang salah dengan hal ini, program ini bekerja dengan sempurna. Keluaran konsol:
Pabrik mobil kami bernama Ford, didirikan 115 tahun yang lalu, selama ini telah memproduksi 50.000.000 mobil, rata-rata memproduksi 434.782 mobil per tahun.
Namun nyatanya, kita telah menanam bom waktu. Dan kode seperti itu dapat dengan mudah menyebabkan kesalahan. Bayangkan sekarang kita tidak berbicara tentang Ford, tetapi tentang pabrik baru "Amigo Motors", yang telah berdiri kurang dari setahun dan telah memproduksi 1000 mobil:

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);
   }
}
Keluaran konsol:
Pabrik mobil kami bernama Amigo Motors Exception di thread "main" java.lang.ArithmeticException: / by zero Didirikan 0 tahun yang lalu Selama ini, ia memproduksi 1000 mobil di CarFactory.<init>(CarFactory.java:15) di CarFactory.main(CarFactory.java:23) Proses selesai dengan kode keluar 1</init>
Kami telah tiba! Program berakhir dengan beberapa kesalahan aneh. Maukah Anda mencoba menebak apa alasannya? Alasannya adalah logika yang kami tempatkan di konstruktor. Secara khusus, di baris ini:

System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
Disini kita melakukan perhitungan dan membagi jumlah mobil yang diproduksi dengan umur pabrik. Dan karena pabrik kita masih baru (yaitu berumur 0 tahun), maka hasilnya adalah pembagian dengan 0, yang dilarang dalam matematika. Akibatnya, program berakhir dengan kesalahan. Apa yang seharusnya kita lakukan? Pindahkan semua logika ke dalam metode terpisah dan beri nama, misalnya printFactoryInfo() . Anda dapat meneruskannya ke objek CarFactory sebagai parameter . Anda juga dapat meletakkan semua logika di sana, dan pada saat yang sama - memproses kemungkinan kesalahan, seperti yang terjadi pada nol tahun. Untuk masing-masing miliknya. Konstruktor diperlukan untuk mengatur keadaan suatu objek dengan benar. Untuk logika bisnis kami memiliki metode. Anda tidak boleh mencampurkan satu dengan yang lain.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION