Agregasi vs Komposisi
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 48 dari 87.
Agregasi dan komposisi sama-sama merupakan bentuk hubungan "memiliki", tetapi keduanya berbeda dalam satu aspek penting: kepemilikan dan ketergantungan siklus hidup.
Dalam komposisi, object yang menjadi bagian tidak dapat ada secara terpisah dari wadahnya. Saat wadah dihancurkan, bagian-bagiannya juga ikut hancur. Bayangkan House dan object Room-nya: ruangan tidak ada tanpa rumah:
class House {
private Room[] rooms;
public House(int numRooms) {
rooms = new Room[numRooms];
for (int i = 0; i < numRooms; i++) {
rooms[i] = new Room(); // House membuat dan memiliki rooms
}
}
}Dalam agregasi, object yang terkandung dapat berdiri sendiri. Container menggunakan object tersebut, tetapi tidak mengendalikan siklus hidupnya. Perhatikan Team dan object Player: para pemain tetap ada meskipun tidak memiliki tim:
class Team {
private List<Player> players;
public Team() {
players = new ArrayList<>();
}
public void addPlayer(Player player) {
players.add(player); // Team menggunakan pemain yang sudah ada
}
}Perbedaan utamanya: dalam komposisi, container membuat bagian-bagiannya secara internal. Dalam agregasi, object diberikan dari luar. Saat Team dihapus, object Player tetap ada. Saat House dihapus, object Room di dalamnya juga ikut hilang.
Tantangan
MudahMari kita bangun sistem kursus universitas yang menunjukkan aggregation dan composition. Kamu akan melihat bagaimana Course memiliki object Lecture (composition), sementara Course hanya merujuk pada object Professor yang ada secara independen (aggregation).
Kamu akan menyusun kodemu dalam empat file:
Professor.java: Buat class yang merepresentasikan profesor yang dapat ada secara independen dari kursus mana pun. Professor memiliki dua field private:name(String) dandepartment(String). Sertakan constructor untuk menginisialisasi kedua field dan method getter untuk masing-masing field. OverridetoString()agar mengembalikan:Prof. [name] ([department])Lecture.java: Buat class yang merepresentasikan kuliah yang hanya masuk akal dalam sebuah kursus. Lecture memiliki dua field private:topic(String) dandurationMinutes(int). Sertakan constructor dan getter. OverridetoString()agar mengembalikan:Lecture: [topic] ([durationMinutes] min)Course.java: Di sinilah kamu akan menunjukkan kedua hubungan tersebut! Course memiliki tiga field private:title(String),professor(Professor, aggregation), danlectures(array berisi object Lecture, composition).Constructor menerima judul kursus, object Professor (dikirimkan dari luar, aggregation), dan jumlah kuliah. Di dalam constructor, buat array Lecture dan isi dengan object Lecture baru. Untuk setiap kuliah pada indeks
i, buat object dengan topik"Topic " + (i + 1)dan durasi45menit. Pembuatan internal ini menunjukkan composition.Tambahkan method
getInfo()yang mengembalikan String multi-baris:Course: [title] Instructor: [professor.toString()] Lectures: [number of lectures]Tambahkan juga method
listLectures()yang mengembalikan String dengan toString() setiap kuliah pada barisnya sendiri.Main.java: Satukan semuanya! Kamu akan menerima empat input: nama profesor (String), departemen profesor (String), judul kursus (String), dan jumlah kuliah (int).Pertama, buat Professor dengan nama dan departemen yang diberikan. Professor ini ada secara independen. Lalu buat Course dengan mengirimkan judul, Professor (aggregation), dan jumlah kuliah (Course akan membuat kuliahnya sendiri secara internal, composition).
Cetak hasil
getInfo(), lalu cetak satu baris kosong, kemudian cetak hasillistLectures().
Kamu akan menerima empat input secara berurutan: nama profesor, departemen, judul kursus, dan jumlah kuliah.
Perhatikan perbedaan utamanya: Professor dibuat di luar dan dikirimkan ke Course (aggregation: Professor dapat mengajar kursus lain atau ada tanpa kursus ini). Lecture dibuat di dalam constructor Course (composition). Lecture hanya dimiliki oleh kursus ini dan tidak akan ada tanpanya.
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String professorName = scanner.nextLine();
String department = scanner.nextLine();
String courseTitle = scanner.nextLine();
int numberOfLectures = scanner.nextInt();
// TODO: Buat object Professor (dapat berdiri sendiri, agregasi)
// TODO: Buat object Course dengan meneruskan professor (agregasi)
// Kursus akan membuat kuliahnya sendiri secara internal (komposisi)
// TODO: Cetak hasil getInfo()
// TODO: Cetak baris kosong
// TODO: Cetak hasil listLectures()
}
}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