Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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) dan speedGHz (double). Sertakan constructor untuk menginisialisasi kedua field dan method getter untuk masing-masing field. Tambahkan method process() yang mengembalikan String: [brand] processing at [speedGHz] GHz
  • Memory.java: Buat class yang merepresentasikan RAM. Sebuah Memory memiliki dua field private: type (String, seperti "DDR4" atau "DDR5") dan sizeGB (int). Sertakan constructor, getter, dan method load() yang mengembalikan: Loading [sizeGB]GB [type] memory
  • Computer.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 method boot() yang mengembalikan String beberapa baris untuk menunjukkan komputer mulai berjalan dengan menggunakan komponennya:
    Booting computer...
    [processor.process() result]
    [memory.load() result]
    System ready!
    Tambahkan juga method 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 hasil getSpecs().

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()
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online