• Cum. May 20th, 2022

Merhabalar arkadaşlar. Bu yazıda size Java’da Generic Class kullanımından bahsedeceğim.

İş hayatından geliştirilen projelerde çok sayıda farklı tabloya karşılık gelen POJO, entity sınıfları yer alır ve oturup da bu her bir entity için ayrı ayrı işler yapan metotlar yazmak ne mümkündür ne de doğru bir iştir. Java dilinde de farklı veri tipleri için aynı işi yapabilmek amacı ile Generic Class yapısı ortaya konmuş. Şimdi Generic Class kullanımını örnekleyelim.

Elimizde Student ve Teacher adında şu şekilde iki adet POJO’muz yer alıyor:

Student.java

package com.ilkaygunel.pojo;

public class Student {

    String name;
    String surname;
    String city;
    int studentId;

    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;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    @Override
    public String toString() {
        return name + " " + surname + " " + city + " " + studentId;
    }

}
package com.ilkaygunel.pojo;

public class Teacher {

    String name;
    String surname;
    String city;
    int teacherId;

    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;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public int getTeacherId() {
        return teacherId;
    }

    public void setTeacherId(int teacherId) {
        this.teacherId = teacherId;
    }

    @Override
    public String toString() {
        return name + " " + surname + " " + city + " " + teacherId;
    }

}

POJO’larımızda toString metotlarını kendime göre uyarladık.

ServiceClass isminde bir sınıf tanımlıyoruz ve bu sınıfımızda bu POJO’lar için benzer işleri yapacak metotları oluşturuyoruz. Örneğin veritabanına kayıt işlemi yapılacağı zaman bir create metodu tanımlanıp kullanılabilir. Bizim örneğimizdeki ServiceClass bize gönderilen POJO’nun toString metodu ile elde edilen String halini dönecek.

ServiceClass.java

package com.ilkaygunel.service;

public abstract class ServiceClass<T> {

    private Class<T> entityClass;

    public ServiceClass(Class<T> pojoClass) {
        this.entityClass = pojoClass;
    }

    public String getStringFromEntity(T entity) {
        System.out.println(entityClass.getName());
        return entity.toString();
    }
}

ServiceClass sınıfımız bir abstract sınıf. Az sonra göreceğimiz Operation sınıfları bu sınıfı kaltıcağından ötürü bu sınıfın içinde gövdesi tanımlanmamış metotlar da yer alabilir ve abstract olması bana göre kullanıma daha uygun. Sınıf tanımlanması sırasında bu sınıfın bir parametre alacağını söylüyoruz ve

<T>

ifadesi bu sınıfa Generic olma özelliği kazandırıyor. Artık bu sınıftan kalıtım yaparken istenen tüm sınıflar parametre olarak kullanılabilir. Sınıf içerisinde entityClass adında bir nesnemiz mevcut. Bu sınıfı kalıtmış bir sınftan nesne oluşturulurken oluşturalacak bu nesne ile hangi sınıfın geldiğini konsola yazdıracağız. getStringFromEntity() metodu T tpinde bir parametre bekliyor. Yani bu metot birden farklı tipte parametreyi karşılayabilecek vaziyette. Metot içerisinde ise önce entityClass nesnesinden hangi sınıf tipinde parametre geldiğini yazdırıyoruz sonra da gelen entity’nin String halini döndürüyoruz.

StudenOperationClass.java & TeacherOperationClass.java

StudenOperationClass ve TeacherOperationClass sınıfları arasında hiçbir fark yok. ServiceClass sınıfından extend edilmeleri sırasında hangi POJO sınıfları kullanılarak işlem gerçekleştirilecekse onlar parametre olarak geçiriliyor. OperationClass’lar içinde extend edilen ServiceClass’dan yapılandırıcılar zorunlu olarak yazılıyor ve super ile ServiceClass’ın yapılandırıcısının çağırılmasında POJO sınıfları gönderiliyor.

package com.ilkaygunel.operations;

import com.ilkaygunel.pojo.Student;
import com.ilkaygunel.service.ServiceClass;

public class StudentOperationClass extends ServiceClass<Student> {

    public StudentOperationClass() {
        super(Student.class);
    }

}
package com.ilkaygunel.operations;

import com.ilkaygunel.pojo.Teacher;
import com.ilkaygunel.service.ServiceClass;

public class TeacherOperationClass extends ServiceClass<Teacher> {

    public TeacherOperationClass() {
        super(Teacher.class);
    }

}

MainClass.java

package genericclassexample;

import com.ilkaygunel.operations.StudentOperationClass;
import com.ilkaygunel.operations.TeacherOperationClass;
import com.ilkaygunel.pojo.Student;
import com.ilkaygunel.pojo.Teacher;

public class MainClass {

    public static void main(String[] args) {
        TeacherOperationClass teacherOperationClass = new TeacherOperationClass();
        StudentOperationClass studentOperationClass = new StudentOperationClass();

        Teacher teacher = new Teacher();
        teacher.setName("Alican");
        teacher.setSurname("Akkuş");
        teacher.setCity("İstanbul");
        teacher.setTeacherId(1);

        String teacherResult = teacherOperationClass.getStringFromEntity(teacher);
        System.out.println(teacherResult);

        Student student = new Student();
        student.setName("Mustafa");
        student.setSurname("Demir");
        student.setCity("Isparta");
        student.setStudentId(1);

        String studentResult = studentOperationClass.getStringFromEntity(student);
        System.out.println(studentResult);
    }

}

MainClass içerisindeki main metotda TeacherOperationClass ve StudentOperationClass sınıflarından birer nesne üretiyoruz. Akabinde bir Teacher nesnesi oluşturup teacherOperationClass üzerinden çağırdığımız getStringFromEntity metoduna bu teacher nesnesini geçiriyoruz. Aynı işlemi Student sınıfı için de tekrarlıyoruz. Burada nesne üzerinden ServiceClass içindeki miras alınan getStringFromEntity metodu ilk olarak aldığı POJO nesnesinin hangi sınıf tipinde olduğunu konsola yazdıracak, akabinde String halini bize döndürecek.

Konsol çıktımız şöyle:

Gördüğünüz gibi farklı tiplerden parametre almaya ve işlem yapmaya hazır bir sınıf yazdık ve kullandık. Projelerde bu şekilde merkezi, bir kez yazıp çokça kullanılabilen kod yazımı da hem projenin bakımını kolaylaştırır hem de kod kalitesinin artmasına yardımcı olur.

Bu yazıda anlatacaklarım bu kadar arkadaşlar.

Başka bir yazıda görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle

Merhaba! Ben İlkay Günel :) İstanbul Üniversitesi Bilgisayar Mühendisliği 2016 mezunuyum. Güncel olarak Paycore'da SoftPOS projesinde Java Developer olarak çalışmaktayım. Büyük oranda Java teknolojileri ile uğraşıp kendimi geliştirmeye çalışıyorum ve bu mecrada öğrendiklerimi sizle paylaşmaya da çabalıyorum :) Hakkımda biraz daha detaylı bilgi için: http://www.ilkaygunel.com/about/

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir