Site icon Mobilhanem

Java Abstraction

Anotasyon

Java Dersleri

Merhaba arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize Java Nesne Yönelimli Programlama başlığı altında Java Abstraction konusu ile devam ediyoruz. Java Abstraction nesne yönelimli programlamada büyük bir yer tutmaktadır. Nesnelerin soyutlanmasında ve daha geliştirilebilir ve değiştirilebilir kodlar yazılmasında büyük kolaylık sağlamaktadır.

Java Abstraction

Abstraction yapısı kurularak kullanıcıya yapılacak işlemin fonksiyonelliği sunulur. Bu şekilde kullanıcı kullandığı metodun ne yaptığıyla ilgilenirken, nasıl yaptığıyla ilgilenmez. Bu durumda fonksiyonellik ön plana çıkarken, işin nasıl yapıldığı gizlenir. Yani kullanıcı bir arabayı çalıştırır, o arabanın ilk tetiklemeden sonra hangi aşamalardan geçtiği, arka tarafta neler olduğu konularıyla ilgilenmez.

Java’da Abstraction interface (arayüz) ve abstract class (soyut sınıf) yapıları ile sağlanır. Abstract sınıflarla yapılan tanımlamalara ve kullanım durumuna göre soyutlama oranı fark yaratırken, Interface ler kullanılarak %100 soyutlama sağlanır.

Önemli: Interface ve Abstract Sınıflardan nesne üretilmez.

Interface ler aşağıdaki şekilde tanımlanırlar.

public interface IClass {
}

Java8 öncesinde Java’da interface ler içerisindeki metotların gövdeleri olmaz diyebiliriz. Java8 ile birlikte default metot ve static metot yapıları eklenmiş ve interface ler içerisinde bu yapılar sayesinde gövdeli metotlar yazılabilmeye başlanmıştır. Interface içerisinde Default Method ve Static Method yapılarından ilerleyen derslerimizde bahsedeceğim.

Abstract Class Teknik Özellikleri

Abstract sınıfların teknik yapılarından bahsetmek gerekirse;

  1. Java’da Abstract sınıflar “abstract class” anahtar kelimeleri ile oluşturulur.
    public abstract class AbstractClassDemo {
    }
  2. Java’da bir sınıf abstract olarak tanımlandıysa, abstract bir metot içerir veya içermez.
    public abstract class AbstractClassDemo {
        
        public abstract int calculateSum(int a, int b);
        
        public double calculateDivide(int a, int b) {
            double result = a/b;
            System.out.println("Result: " + result);
            return result;
        }
    }
  3. Java’da bir sınıf içerisinde abstract metot varsa o sınıf abstract sınıf olmak zorundadır.
  4. Java’da tanımlanan abstract metotların gövdeleri olamaz (Gövdeden kasıt içinde işlem yapacak kodlar olmak zorundadır).
  5. Java’da tanımlanan abstract sınıfların içerisindeki abstract olmayan metotların gövdeleri olmalıdır.
  6. Java’da tanımlanan bir sınıf abstract bir sınıf tarafından genişletilirse (extend edilirse) abstract sınıfın tüm abstract metotlarını implement etmek yani kendi bünyesinde bu metotlara gövde oluşturmak zorundadır. Eğer bu metotlara sınıf içerisinde gövde yazılmayacaksa tanımlanan sınıfın yapısı abstract class olarak tanımlanmalıdır.
    public class AbstractClassDemo1 extends AbstractClassDemo{
        @Override
        public int calculateSum(int a, int b) {
            return 0;
        }
    }
    public abstract class AbstractClassDemo1 extends AbstractClassDemo{   
    }

    Yukarıdaki iki kod örneği 6. madde de bahsedilen yapıya göre tanımlanmıştır ve hata vermezler.

Örnek

Gerçek hayata yakın bir örnek vermeye çalışalım, Person.java sınıfı içerisinde bir kişiye ait isim, soyisim ve id bilgileri tutulmaktadır.

public class Person {

  private int id;
  private String name;
  private String surname;

  public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }
}

Employee.java sınıfı ise her Employee(Çalışan) bir Person(kişi) olacağı için Person sınıfı ile genişletilmiş olup bu sınıfı miras almıştır. Fakat her firmanın çalışan maaşını farklı hesapladığı bir algoritması olduğu düşünüldüğünde Employee sınıfı içerisinde tek bir metot yazılıp tüm firmalar için çalışması beklenemez. Bu gibi durumlarda superclass abstraction yapısından faydalanılarak miras alındığı sınıflar için farklı davranışlar sergileyebilir.

public abstract class Employee extends Person {

    private String jobtitle;

    public String getJobtitle() {
        return jobtitle;
    }

    public void setJobtitle(String jobtitle) {
        this.jobtitle = jobtitle;
    }

    public abstract float calculateSalary();
}

Abstract yapısından faydalanılarak oluşturulan Employee sınıfı oluşturulacak diğer firma employee sınıflarına miras verilerek firmaya özel maaş hesaplama algoritmaları kullanılabilir.

public class FirstFirmEmployee extends Employee {

    private static final int CONST_ALES = 2;
    private static final float CONST_UNI = 0.3f;
    private static final int CONST = 10000;

    public static void main(String[] args) {
        FirstFirmEmployee firstFirmEmployee = new FirstFirmEmployee();
        firstFirmEmployee.setId(1);
        firstFirmEmployee.setName("Vehbi");
        firstFirmEmployee.setSurname("Akdoğan");
        firstFirmEmployee.setJobtitle("PHP Uzmanı");

        System.out.println(firstFirmEmployee.getName()+ " " + firstFirmEmployee.getSurname());
        System.out.println(firstFirmEmployee.getJobtitle());
        System.out.println(firstFirmEmployee.calculateSalary() + "₺");
    }

    @Override
    public float calculateSalary() {
        return CONST * (CONST_ALES * CONST_UNI);
    }
}
public class SecondFirmEmployee extends Employee{

    private static final int CONST_ALES = 2;
    private static final int CONST = 10000;

    public static void main(String[] args) {
        SecondFirmEmployee firstFirmEmployee = new SecondFirmEmployee();
        firstFirmEmployee.setId(1);
        firstFirmEmployee.setName("Vehbi");
        firstFirmEmployee.setSurname("Akdoğan");
        firstFirmEmployee.setJobtitle("PHP Uzmanı");

        System.out.println(firstFirmEmployee.getName()+ " " + firstFirmEmployee.getSurname());
        System.out.println(firstFirmEmployee.getJobtitle());
        System.out.println(firstFirmEmployee.calculateSalary() + "₺");
    }

    @Override
    public float calculateSalary() {
        return CONST * (CONST_ALES * 0.75f);
    }
}

SecondFirmEmployee ile FirstFirmEmployee sınıflarında maaş bilgileri farklı hesaplanmasına rağmen diğer bilgiler aynı tutulduğu için kodun birden çok kere yazılmasına gerek kalmadan abstraction yapısından faydalanılarak bir çözüm bulunmuştur. Abstract bir metot oluşturularak her sınıf içerisinde bu metot farklı işlemleri yapacak şekilde tasarlanmıştır. Aslında biz abstraction class tanımlayarak bu sınıfı extends eden sınıfların neleri @override etmesi gerektiği bilgisini vermiş olduk.

Sonuç

Java Nesne Yönelimli Programlamanın önemli paydaşlarından biri olan Abstraction ile esnek ve rahatlıkla değiştirilebilir kodlar yazılabilir. Kod tekrarlarının önüne geçileceği için için ve her sınıfa özelleştirilmiş metotlar oluşturulabileceği için bakım kolay projeler ortaya çıkacaktır.

Ayrıca biz 10’larca farklı class’ı tek bir abstract class’dan extend edebiliriz. Böylelikle şunu biliyoruz ki bu 10 farklı class içinde aynı method (yukarıdaki örnekte calculateSalary methodu ) override edildi ve biz bu methodu çağırabiliriz. Böylelikle Abstraction bize Object Orianted’ın olmazsa olmazı Polymorphism’i sağlamış oldu. Polymorphism konusunu ilerleyen derslerimizde inceleyeceğiz.

Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.

Tüm Java Dersleri için tıklayınız..

48
Exit mobile version