Java’da Sınıflar Arası İlişkiler
Nesne yönelimli programlama sınıflar arası ilişki kurarak dizayn edilmektedir. Sınıfların belirlenmesi ve sistemi tasarlarken sınıflar…
Java’da Sınıflar Arası İlişkiler
Nesne yönelimli programlama sınıflar arası ilişki kurarak dizayn edilmektedir. Sınıfların belirlenmesi ve sistemi tasarlarken sınıflar arasında nasıl bir ilişki olacağı önemlidir. Bu sistem dizaynını iyi bir şekilde oluşturduğumuz taktirde güzel bir başlangıç yapmış oluruz ve yazacağımız kodun kalitesi artar. Peki, sınıflar arasındaki ilişkiler nelerdir?
Sınıflar arasında oluşturulabilecek 3 temel ilişki vardır. Bunlar: bağımlılık (dependency), birleştirme (composition) ve kalıtım (inheritance).
Bağımlılık (Dependency)
Java’da bağımlılık, bir diğer adıyla uses a ilişkisi şudur: Eğer bir sınıfın metotlarından en az biri, başka bir sınıfa ait parametre alıyorsa veya metot içerisinde başka bir sınıftan nesne üretiliyorsa, böyle bir metoda sahip olan sınıf diğer sınıfa bağımlıdır ya da onu uses eder (kullanır) denir.
Yazılan programda sınıflar arası bağımlılığı arttırmak, birlikte yönetilmesi gereken sınıf miktarının da artmasına sebep olur. Bu durumda programın yönetilebilirliği ve bakımı zorlaşacaktır. Zira bir sınıf içerisinde yapılacak herhangi bir değişiklik bağımlı olduğu sınıfları da etkileyecektir ve bakım yükü artacaktır.
Konuyu örneklendirelim. Student (öğrenci) ve Course (ders) adında iki sınıfımız olsun. Course sınıfı içerisinde öğrencilerin o derse ait notlarının ortalamasını hesaplayalım:
public class Student {
private String name;
private String surname;
private int age;
private int note;
public Student(String name, String surname, int age, int note) {
this.name = name;
this.surname = surname;
this.age = age;
this.note = note;
}
//Getter ve Setter metotlarının yazıldığını varsayıyorum...
public int getNote(){
return this.note;
}
}
public class Course {
private String courseName;
private String courseCode;
public Course(String courseName, String courseCode) {
this.courseName = courseName;
this.courseCode = courseCode;
}
//Getter ve Setter metotlarının yazıldığını varsayıyorum...
//Söz konusu dersin öğrenci ortalamasını hesaplıyoruz
//Course uses a Student (Course sınıfı Student sınıfını kullanır)
public double calculateAverage(Student[] students){
double sum = 0;
for(Student student: students){
sum += student.getNote();
}
double average = sum / students.length;
return average;
}
}
public class Main {
public static void main(String[] args) {
Student ali = new Student("Ali","Avşar",16,85);
Student cabbar = new Student("Cabbar","Avşar",16,85);
Student veli = new Student("Veli","Avşar",17,85);
Course matematik = new Course("Matematik","MAT101");
Student[] students = {ali, cabbar, veli};
System.out.println(matematik.calculateAverage(students));
}
}
Bu örnekte görüldüğü üzere Ali, Cabbar ve Veli adlı öğrencilerin matematik dersi notlarının ortalamasını hesapladık. Course sınıfındaki calculateAverage() metodu, parametre olarak Student sınıfından bir dizi alıyor. Dolayısıyla bu metoda sahip olan Course sınıfı, Student sınıfına bağımlı hâle geliyor. Şayet biz, Student sınıfındaki note değişkenini kaldıracak olursak calculateAverage() metodu da kullanışsız hâle gelecektir.
Birleştirme (Composition)
Java’da birleştirme, diğer adıyla has a ilişkisi şöyledir: Eğer bir sınıfın değişkenlerinden en az bir tanesi başka bir sınıf türünden ise, değişkene sahip olan sınıf diğer sınıfı içerir, yani has a (sahiptir) denir.
Konuyu örneklendirelim. Önceki Course sınıfını kullanacağız ve Instructor (akademisyen) adında yeni bir sınıf oluşturacağız:
public class Instructor {
private String name;
private String surname;
private String department;
public Instructor(String name, String surname, String department) {
this.name = name;
this.surname = surname;
this.department = department;
}
//Getter ve Setter metotlarının yazıldığını varsayıyorum
public String getName(){
return this.name;
}
}
Şimdi Course sınıfında birleştirme işlemini uygulayalım:
public class Course {
private String courseName;
private String courseCode;
//Her dersin bir hocası olmalıdır (Birleştirme)
private Instructor instructor;
public Course(String courseName, String courseCode, Instructor instructor) {
this.courseName = courseName;
this.courseCode = courseCode;
this.instructor = instructor;
}
//Getter ve Setter metotlarının yazıldığını varsayıyorum...
public Instructor getInstructor(){
return this.instructor;
}
}
Her Course yani ders, bir öğretmene ihtiyaç duymaktadır. Bundan dolayı Course sınıfı ile Instructor sınıfını birleştirdik. Yani, Course sınıfının değişkenlerinden en az bir tanesi başka bir sınıfa ait olan nesne olmuş oldu. Main sınıfında şu işlemi yaparak dersin hocasının ismine ulaşabiliriz:
public class Main {
public static void main(String[] args) {
Instructor instructor = new Instructor("Şevket","Üstün","Matematik");
Course matematik = new Course("Matematik","MAT101", instructor);
System.out.println(matematik.getInstructor().getName());
}
}
Kodu çalıştırdığımızda “Şevket” çıktısını alacağız.
Burada şöyle bir detay var: Şayet Instructor sınıfı Course sınıfı olmadan da kendi başına var olabiliyorsa bu durumda yaptığımız işleme aggregation adı verilir. Yaptığımız örnekte aslında aggregation uyguluyoruz çünkü Instructor sınıfı kendi başına var olabilir. Örneğin, instructor nesnesinin department değişkenini veya başka bir değişkenini farklı şekillerde kullanmak isteyebiliriz.
Eğer Instructor sınıfının kendi başına var olması mümkün değilse, Course sınıfı olmadan Instructor sınıfının bir anlamı yoksa bu durumda yapılan işleme composition adı verilir.
Geriye kalıtım (inheritance) ilişkisi kaldı. Inheritance konusu detaylı bir konu olduğu için bu yazıyı uzatmamak adına onu diğer yazımda ele almak istiyorum. Keyifli okumalar…
메타데이터
- post_id
- fa7f69885e26
- slug
- javada-sınıflar-arası-i̇lişkiler-fa7f69885e26
- url
- https://medium.com/@mstfkrky011/javada-s%C4%B1n%C4%B1flar-aras%C4%B1-i%CC%87li%C5%9Fkiler-fa7f69885e26
- canonical_url
- https://medium.com/@mstfkrky011/javada-s%C4%B1n%C4%B1flar-aras%C4%B1-i%CC%87li%C5%9Fkiler-fa7f69885e26
- author_url
- https://medium.com/@mstfkrky011
- status
- ok
- fetched_at
- 2026-08-02 09:47:19