Nesne yönelimli programlama (OOP), sağlam ve sürdürülebilir Java uygulamalarının temel taşıdır. İki önemli OOP kavramı olan kompozisyon ve agregasyon, genellikle kafa karışıklığına neden olur. Her ikisi de nesneler arasında “sahip olma” ilişkilerini temsil eder ancak etkileri ve kullanımları bakımından önemli ölçüde farklılık gösterir. Bu makale, bu farklılıkları pratik örneklerle açıklamaktadır.
İçindekiler Tablosu
- Java’da Kompozisyon
- Java’da Agregasyon
- Kompozisyon ve Agregasyon Karşılaştırması
- Java’da Kompozisyon ile Çalışma
- Java’da Agregasyon ile Çalışma
Java’da Kompozisyon
“Güçlü” bir sahip olma ilişkisi olan kompozisyon, parçanın yaşam döngüsünün tamamen bütünün bağlı olduğu bütün-parça ilişkisini ifade eder. Bütünün yok edilmesi, parçalarını da yok eder; parçalar bağımsız olarak var olamaz. Bir arabayı düşünün: bir motordan, tekerleklerden, kapılardan vb. oluşur. Arabayı hurdaya ayırmak bu bileşenleri de yok eder.
Java’da kompozisyon, genellikle bütün nesnesinin sınıfı içinde parça nesnelerinin doğrudan örneklenmesiyle uygulanır. Bütün nesnesi bu parçaları oluşturur ve yönetir.
Java’da Agregasyon
“Zayıf” bir sahip olma ilişkisi olan agregasyon, parçanın bütünün dışında bağımsız olarak var olabileceğini gösterir. Bütün nesnesi parçalara referanslar tutar, ancak yaşam döngüleri doğrudan bağlantılı değildir. Örneğin, bir üniversite “sahiptir” bir bölüme, ancak üniversite kapanmış olsa bile bölüm devam eder.
Java’da agregasyon, bütün nesnesinin parça nesnelerine referanslar tutmasını içerir. Bu referanslar ayrı olarak yönetilebilir. Parçalar bütün nesneden önce veya sonra oluşturulabilir ve yok oluşundan sonra da var olabilir.
Kompozisyon ve Agregasyon Karşılaştırması
Aşağıdaki tablo, temel farklılıkları özetlemektedir:
Özellik | Kompozisyon | Agregasyon |
---|---|---|
İlişki | Güçlü “sahip olma” (bütün-parça) | Zayıf “sahip olma” |
Yaşam Döngüsü | Parçanın yaşam döngüsü bütünün yaşam döngüsüne bağlıdır | Parçanın yaşam döngüsü bütünün yaşam döngüsünden bağımsızdır |
Sahiplik | Bütün nesnesi parçaları sahiplenir ve yönetir | Bütün nesnesi parçalara referanslar tutar |
Parçanın Varlığı | Parça bağımsız olarak var olamaz | Parça bağımsız olarak var olabilir |
Uygulama | Bütün nesnesi içinde doğrudan örnek oluşturma | Bağımsız parça nesnelerine referanslar |
Java’da Kompozisyon ile Çalışma
Bir Motor
dan oluşan bir Araba
ile kompozisyonu gösterelim:
class Motor {
public void basla() { System.out.println("Motor çalıştı"); }
}
class Araba {
private Motor motor;
public Araba() {
this.motor = new Motor();
}
public void sur() {
motor.basla();
System.out.println("Araba sürüyor");
}
}
public class Main {
public static void main(String[] args) {
Araba benimArabam = new Araba();
benimArabam.sur();
}
}
Motor
nesnesi Araba
sınıfı içinde oluşturulur. Motor
‘un varlığı Araba
‘ya bağlıdır.
Java’da Agregasyon ile Çalışma
Şimdi, bir üniversite ve bölümleriyle agregasyonu gösterelim:
class Bolum {
private String ad;
public Bolum(String ad) { this.ad = ad; }
public String getAd() { return ad; }
}
class Universitesi {
private Bolum[] bolumler;
public Universitesi(Bolum[] bolumler) {
this.bolumler = bolumler;
}
public void bolumleriYazdir() {
for (Bolum bolum : bolumler) {
System.out.println("Bölüm: " + bolum.getAd());
}
}
}
public class Main {
public static void main(String[] args) {
Bolum bilgisayar = new Bolum("Bilgisayar Bilimleri");
Bolum matematik = new Bolum("Matematik");
Bolum[] bolumDizisi = {bilgisayar, matematik};
Universitesi uni = new Universitesi(bolumDizisi);
uni.bolumleriYazdir();
}
}
Universitesi
, Bolum
nesnelerine referanslar tutar. Bolum
nesneleri bağımsız olarak var olur ve başka yerlerde kullanılabilir.
Kompozisyon ve agregasyonun anlaşılması, daha sağlam, sürdürülebilir ve iyi yapılandırılmış Java uygulamaları tasarlamayı sağlar. Seçim, tasarım gereksinimlerine ve nesnelerin istenen yaşam döngüsü yönetimine bağlıdır.