Agregasyon vs Kompozisyon
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 48 / 87.
Hem toplama hem de bileşim, "sahiptir" ilişkilerinin biçimleridir, ancak çok önemli bir açıdan farklılık gösterirler: sahiplik ve yaşam döngüsü bağımlılığı.
Bileşimde, içerilen nesne kapsayıcıdan bağımsız olarak var olamaz. Kapsayıcı yok edildiğinde parçaları da yok edilir. Bir House ve onun Room nesnelerini düşünün: odalar ev olmadan var olmaz:
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 odaları oluşturur ve onlara sahiptir
}
}
}Toplama işleminde, içerilen nesne bağımsız olarak var olabilir. Kapsayıcı nesneyi kullanır ancak yaşam döngüsünü kontrol etmez. Bir Team ve onun Player nesnelerini düşünün: oyuncular bir takım olmadan da var olabilir:
class Team {
private List<Player> players;
public Team() {
players = new ArrayList<>();
}
public void addPlayer(Player player) {
players.add(player); // Team mevcut oyuncuları kullanır
}
}Temel ayrım: bileşimde kapsayıcı, parçalarını dahili olarak oluşturur. Birleştirmede nesneler dışarıdan aktarılır. Bir Team silindiğinde, Player nesneleri hâlâ var olur. Bir House silindiğinde, Room nesneleri de ortadan kalkar.
Görev
KolayHem toplama hem de bileşimi gösteren bir üniversite ders sistemi oluşturalım. Bir Course nesnesinin kendi Lecture nesnelerine sahip olduğunu (bileşim), buna karşılık yalnızca bağımsız olarak var olan Professor nesnelerine başvurduğunu (toplama) göreceksin.
Kodunu dört dosyaya ayıracaksın:
Professor.java: Herhangi bir dersten bağımsız olarak var olabilen bir profesörü temsil eden bir sınıf oluştur. Bir Professor'ın iki private alanı vardır:name(String) vedepartment(String). Her iki alanı da başlatmak için bir constructor ve her biri için getter metotları ekle.toString()metodunu şu değeri döndürecek şekilde geçersiz kıl:Prof. [name] ([department])Lecture.java: Yalnızca bir dersin içinde anlamlı olan bir konferansı temsil eden bir sınıf oluştur. Bir Lecture'ın iki private alanı vardır:topic(String) vedurationMinutes(int). Bir constructor ve getter'lar ekle.toString()metodunu şu değeri döndürecek şekilde geçersiz kıl:Lecture: [topic] ([durationMinutes] min)Course.java: Her iki ilişkiyi de burada göstereceksin! Bir Course'un üç private alanı vardır:title(String),professor(Professor - toplama) velectures(Lecture nesnelerinden oluşan bir dizi - bileşim).Constructor, ders başlığını, bir Professor nesnesini (dışarıdan geçirilen - toplama) ve konferansların sayısını alır. Constructor'ın içinde Lecture dizisini oluştur ve yeni Lecture nesneleriyle doldur.
iindeksindeki her konferans için, onu"Topic " + (i + 1)konusu ve45dakikalık süreyle oluştur. Bu dahili oluşturma, bileşimi gösterir.Çok satırlı bir String döndüren bir
getInfo()metodu ekle:Course: [title] Instructor: [professor.toString()] Lectures: [number of lectures]Ayrıca her konferansın toString() sonucunu kendi satırında döndüren bir
listLectures()metodu ekle.Main.java: Her şeyi bir araya getir! Dört girdi alacaksın: profesör adı (String), profesör bölümü (String), ders başlığı (String) ve konferansların sayısı (int).İlk olarak, verilen ad ve bölümle bir Professor oluştur. Bu profesör bağımsız olarak var olur. Ardından title, professor (toplama) ve konferans sayısını alacak şekilde bir Course oluştur (ders kendi konferanslarını dahili olarak oluşturacaktır - bileşim).
getInfo()sonucunu yazdır, ardından boş bir satır yazdır ve sonralistLectures()sonucunu yazdır.
Dört girdiyi şu sırayla alacaksın: profesör adı, bölüm, ders başlığı ve konferansların sayısı.
Temel farka dikkat et: Professor dışarıda oluşturulur ve Course'a geçirilir (toplama: profesör başka dersler verebilir veya bu ders olmadan var olabilir). Lecture nesneleri Course constructor'ı içinde oluşturulur (bileşim). Yalnızca bu derse aittirler ve bu ders olmadan var olmazlardı).
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String professorName = scanner.nextLine();
String department = scanner.nextLine();
String courseTitle = scanner.nextLine();
int numberOfLectures = scanner.nextInt();
// TODO: Bir Professor nesnesi oluştur (bağımsız olarak var olur - aggregation)
// TODO: professor'ı geçirerek bir Course nesnesi oluştur (aggregation)
// Course kendi lecture'larını dahili olarak oluşturacak (composition)
// TODO: getInfo() sonucunu yazdır
// TODO: Boş bir satır yazdır
// TODO: listLectures() sonucunu yazdır
}
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi