Generics'e Giriş
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 53 / 87.
Daha sonra geri almak üzere bir değer depolayan bir sınıf oluşturmanız gerektiğini düşünün. Jenerikler olmadan, her tür için ayrı sınıflar yazmanız gerekirdi: Integer için bir tane, String için bir tane, Double için bir tane ve bu şekilde devam eder. Bu durum kod tekrarına ve bakım sorunlarına yol açar.
Generikler, tür güvenliğini korurken herhangi bir türle çalışan sınıflar ve metotlar yazmanıza olanak tanıyarak bu sorunu çözer. Bir sınıfı kullandığınızda gerçek bir türle değiştirilen bir yer tutucu (tür parametresi olarak adlandırılır) tanımlarsınız:
// Jenerikler olmadan - Object kullanır, casting gerektirir
List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0); // Manuel casting gerekli
// Jeneriklerle - tip güvenli, casting yok
List<String> list = new ArrayList<String>();
list.add("Hello");
String s = list.get(0); // Casting gerekmezAçı parantezleri <T> bir tür parametresini belirtir. List<String> yazdığında, derleyiciye bu listede yalnızca dizelerin bulunacağını söylersin. Bir tamsayı eklemeye çalışırsan derleyici, çalışma zamanında başarısız olmak yerine hatayı hemen yakalar.
Jenerikler iki temel fayda sağlar: açık tür dönüştürme gereksinimini ortadan kaldırır ve tür hatalarını çalışma zamanı yerine derleme zamanında yakalar. Bu, kodunuzu hem daha güvenli hem de daha temiz hâle getirir. Sonraki derslerde, kendi jenerik sınıflarınızı ve yöntemlerinizi nasıl oluşturacağınızı inceleyeceğiz.
Görev
KolayObject kullanarak dönüştürme yapılan eski yöntem ile tür güvenliği sağlayan generic'leri kullanan yeni yöntemi karşılaştırarak generic'lerin gücünü gösteren basit bir depolama sistemi oluşturalım.
Aradaki farkı ilk elden görmek için üç dosya oluşturacaksınız:
OldBox.java: Değerleri generic'lerden önceki yöntemle depolayan bir sınıf oluşturun. OldBox sınıfınızdacontenttüründe, private birObjectalanı bulunmalıdır. Bir Object kabul edip bunu depolayan bir kurucu ve Object döndüren birgetContent()yöntemi ekleyin. Bu yaklaşım çalışır, ancak değerleri alırken dönüştürme yapılmasını gerektirir.GenericBox.java: Şimdi generic'leri kullanarak modern ve tür güvenli sürümü oluşturun. GenericBox bildirimindeTtür parametresini kullanmalıdır.contenttüründe private birTalanına,Ttüründe bir değer kabul eden bir kurucuya vegetContent()türünü döndüren birTyöntemine ihtiyacı vardır. Bu sınıfı kullanırken dönüştürme gerekmez!Main.java: Her iki yaklaşımı yan yana gösterin. İki girdi alacaksınız: bir sözcük (String) ve bir sayı (integer).İlk olarak eski yaklaşımı kullanın: sözcüğü depolayan bir OldBox oluşturun, ardından String'e dönüştürerek geri alın ve şunu yazdırın:
OldBox (with cast): [value]Ardından generic yaklaşımı kullanın: aynı sözcüğü depolayan bir
GenericBox<String>oluşturun, dönüştürme yapmadan geri alın ve şunu yazdırın:GenericBox (no cast): [value]Sonra generic'lerin tamsayılarla çalıştığını gösterin: sayıyı depolayan bir
GenericBox<Integer>oluşturun, sayıyı geri alın ve şunu yazdırın:GenericBox Integer: [value]Son olarak boş bir satırın ardından şunu yazdırın:
Type safety: Generics catch errors at compile time!
Sırayla iki girdi alacaksınız: bir sözcük (String) ve bir sayı (parse edeceğiniz String olarak integer).
Temel farka dikkat edin: OldBox ile (String) box.getContent() dönüşümünü yapmalı ve türü doğru aldığınızı ummalısınız. GenericBox ile derleyici türü bilir ve dönüştürme gerekmez. Generic'lerin temel faydası budur: dönüştürme zahmeti olmadan tür güvenliği!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String word = scanner.nextLine();
int number = Integer.parseInt(scanner.nextLine());
// TODO: Kelimeyi saklayan bir OldBox oluştur
// Retrieve with cast to String and print: "OldBox (with cast): [value]"
// TODO: Kelimeyi saklayan bir GenericBox<String> oluştur
// Retrieve without casting and print: "GenericBox (no cast): [value]"
// TODO: Create a GenericBox<Integer> storing the number
// Retrieve and print: "GenericBox Integer: [value]"
// TODO: Boş bir satır yazdır, sonra yazdır:
// "Type safety: Generics catch errors at compile time!"
}
}
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