Komposisi vs Pewarisan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 47 dari 87.
Inheritance menciptakan hubungan "adalah": Dog adalah Animal. Namun, bagaimana jika sebuah class membutuhkan fungsionalitas dari sesuatu yang bukan dirinya? Di sinilah composition berperan, dengan membentuk hubungan "memiliki".
Dengan komposisi, sebuah class berisi instance dari class lain sebagai field, bukan mewarisinya:
// Pendekatan pewarisan: Car ADALAH Engine (tidak masuk akal)
class Car extends Engine { }
// Pendekatan komposisi: Car MEMILIKI Engine (masuk akal)
class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.ignite();
}
}Komposisi menawarkan beberapa keuntungan. Kamu dapat mengubah object yang dikomposisikan saat program berjalan, misalnya dengan mengganti mesin.
Kamu juga bisa menggabungkan perilaku dari beberapa class, sesuatu yang tidak dimungkinkan oleh inheritance di Java. Class gabungan hanya mengekspos method yang dipilihnya, sehingga memberikan enkapsulasi yang lebih baik.
Pedoman praktis: gunakan pewarisan ketika benar-benar ada hubungan "is-a" dan subclass memang merupakan versi khusus dari parent.
Gunakan komposisi saat kamu perlu menggunakan fungsionalitas class lain tanpa menjadi tipe tersebut. Banyak developer berpengalaman mengikuti prinsip: "utamakan komposisi daripada pewarisan" karena prinsip ini menghasilkan kode yang lebih fleksibel dan mudah dipelihara.
Tantangan
MudahMari bangun sistem komputer menggunakan komposisi untuk menunjukkan hubungan "has-a". Alih-alih Computer mewarisi komponen-komponennya (yang tidak masuk akal), komputermu akan memuat bagian-bagian yang dibutuhkan agar dapat berfungsi.
Kamu akan menyusun kodemu dalam tiga file:
Processor.java: Buat class yang merepresentasikan CPU. Sebuah Processor memiliki dua field private:brand(String) danspeedGHz(double). Sertakan constructor untuk menginisialisasi kedua field dan method getter untuk masing-masing field. Tambahkan methodprocess()yang mengembalikan String:[brand] processing at [speedGHz] GHzMemory.java: Buat class yang merepresentasikan RAM. Sebuah Memory memiliki dua field private:type(String, seperti "DDR4" atau "DDR5") dansizeGB(int). Sertakan constructor, getter, dan methodload()yang mengembalikan:Loading [sizeGB]GB [type] memoryComputer.java: Di sinilah komposisi berperan! Class Computer-mu harus memiliki Processor dan Memory sebagai field private. Class ini tidak mewarisi keduanya, tetapi memuat keduanya. Sertakan constructor yang menerima kedua komponen. Tambahkan methodboot()yang mengembalikan String beberapa baris untuk menunjukkan komputer mulai berjalan dengan menggunakan komponennya:Tambahkan juga methodBooting computer... [processor.process() result] [memory.load() result] System ready!getSpecs()yang mengembalikan:Specs: [processor brand] CPU, [memory sizeGB]GB [memory type]Main.java: Hidupkan sistem yang telah kamu susun! Kamu akan menerima empat input: merek prosesor (String), kecepatan prosesor (double), tipe memori (String), dan ukuran memori (int).Buat Processor dan Memory dengan nilai-nilai ini, lalu susun keduanya menjadi sebuah Computer. Cetak hasil pemanggilan
boot(), lalu cetak hasilgetSpecs().
Kamu akan menerima empat input secara berurutan: merek prosesor, kecepatan prosesor (GHz), tipe memori, dan ukuran memori (GB).
Perhatikan bagaimana Computer mendelegasikan pekerjaan kepada komponennya, alih-alih mencoba menjadi komponen-komponen itu. Inilah keunggulan komposisi! Computer dapat menggunakan Processor atau Memory apa pun yang kamu berikan, sehingga desainnya fleksibel dan realistis.
Coba sendiri
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String processorBrand = scanner.nextLine();
double processorSpeed = Double.parseDouble(scanner.nextLine());
String memoryType = scanner.nextLine();
int memorySize = Integer.parseInt(scanner.nextLine());
// TODO: Buat Processor dengan merek dan kecepatannya
// TODO: Buat Memory dengan tipe dan ukurannya
// TODO: Buat Computer dengan menggabungkan Processor dan Memory
// TODO: Cetak hasil boot()
// TODO: Cetak hasil getSpecs()
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online