Generic Sınıflar
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 54 / 87.
Genericlerin neden yararlı olduğunu anladığınıza göre, kendi generic sınıfınızı oluşturalım. Bir generic sınıf, sınıf adından sonra açılı ayraçlar içinde bir veya daha fazla tür parametresi bildirir ve bu parametreler daha sonra sınıf boyunca kullanılabilir.
class Box<T> {
private T content;
public void set(T content) {
this.content = content;
}
public T get() {
return content;
}
}T bir tip parametresidir; bir örnek oluşturduğunuzda gerçek bir tiple değiştirilen bir yer tutucudur. Herhangi bir isim kullanabilirsiniz, ancak tek büyük harfler gelenekseldir: Type için T, Element için E, Key için K, Value için V.
Bir jenerik sınıfı örneklerken, gerçek türü açılı ayraçlar içinde belirtirsiniz:
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get(); // Tür dönüştürmeye gerek yok
Box<Integer> intBox = new Box<>();
intBox.set(42);
Integer num = intBox.get();Sağ taraftaki <> (elmas operatörü) işaretine dikkat edin—Java, türü bildirimden çıkarır. Birden fazla türle çalışması gereken sınıflar için birden fazla tür parametresi de kullanabilirsiniz:
class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
Pair<String, Integer> pair = new Pair<>("age", 25);Görev
KolayGeneric sınıfların gücünü sergileyen bir hediye kayıt sistemi oluşturalım. Her türlü hediye öğesini tutabilen esnek bir depolama sisteminin yanı sıra, birden fazla tür parametresi kullanarak hediye adlarını ayrıntılarıyla eşleştiren bir kayıt defteri oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
GiftBox.java: Her türlü hediyeyi paketleyebilen generic bir sınıf oluşturun.GiftBox<T>sınıfınız,Ttüründe özel biritemalanına ve başlangıçtafalseolan özel birwrapped(boolean) alanına sahip olmalıdır. Öğeyi kabul eden bir yapıcı (constructor), öğeyi döndüren birgetItem()metodu, wrapped değerini true olarak ayarlayan birwrap()metodu ve paketlenme durumunu döndüren birisWrapped()metodu ekleyin. Paketlenme durumuna bağlı olarak[item] (wrapped)veya[item] (unwrapped)döndüren birgetStatus()metodu ekleyin.Registry.java: Bir alıcıyı hediyesiyle eşleştiren iki tür parametreli generic bir sınıf oluşturun.Registry<K, V>sınıfınız,Ktüründe özel birrecipientalanına veVtüründe özel birgiftalanına sahip olmalıdır. Her iki değeri de kabul eden bir yapıcı,getRecipient()vegetGift()getter metotlarını ve şu formatı döndüren birgetEntry()metodu ekleyin:[recipient] -> [gift]Main.java: Hediye kayıt sisteminizi hayata geçirin! Üç girdi alacaksınız: bir alıcı adı (String), bir hediye açıklaması (String) ve bir hediye değeri (doları temsil eden bir tamsayı).İlk olarak, hediye açıklamasını içeren bir
GiftBox<String>oluşturun.wrap()metodunu kullanarak paketleyin ve ardından durumunu yazdırın.Ardından, hediye değerini (bir hediye kartı tutarını temsil eden) içeren bir
GiftBox<Integer>oluşturun. Bunu paketlemeyin; paketlenmemiş olduğunu göstermek için durumunu yazdırın.Son olarak, alıcı adını hediye açıklamasıyla eşleştiren bir
Registry<String, String>oluşturun ve kayıt girişini yazdırın.
Sırasıyla üç girdi alacaksınız: alıcı adı, hediye açıklaması ve hediye değeri (tamsayı olarak).
Aynı GiftBox sınıfının hem String hem de Integer türleriyle nasıl sorunsuz çalıştığına dikkat edin; generic yapıların güzelliği budur! Ve Registry sınıfı, birden fazla tür parametresinin herhangi iki tür arasında nasıl esnek eşleşmeler oluşturmanıza izin verdiğini gösterir.
Kopya kağıdı
Bir generic sınıf, sınıf adından sonra açılı ayraçlar içinde, sınıf boyunca kullanılabilecek bir veya daha fazla tür parametresi bildirir:
class Box<T> {
private T content;
public void set(T content) {
this.content = content;
}
public T get() {
return content;
}
}T bir tür parametresidir; bir örnek oluşturulurken gerçek bir türle değiştirilen bir yer tutucudur. Yaygın kurallar tek büyük harf kullanır: Tür (Type) için T, Eleman (Element) için E, Anahtar (Key) için K, Değer (Value) için V.
Bir generic sınıfı örneklerken, gerçek türü açılı ayraçlar içinde belirtin:
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get(); // No casting needed
Box<Integer> intBox = new Box<>();
intBox.set(42);
Integer num = intBox.get();<> (elmas operatörü), Java'nın türü bildirimden çıkarmasına olanak tanır.
Birden fazla türle çalışan sınıflar için birden fazla tür parametresi kullanın:
class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
Pair<String, Integer> pair = new Pair<>("age", 25);Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String recipientName = scanner.nextLine();
String giftDescription = scanner.nextLine();
int giftValue = scanner.nextInt();
// TODO: Hediye açıklamasını içeren bir GiftBox<String> oluşturun
// TODO: wrap() metodunu kullanarak onu paketleyin
// TODO: getStatus() kullanarak durumunu yazdırın
// TODO: Hediye değerini içeren bir GiftBox<Integer> oluşturun
// TODO: Bunu paketlemeyin - durumunu yazdırın (paketlenmemiş olarak görünmelidir)
// TODO: Alıcıyı hediye açıklamasıyla eşleştiren bir Registry<String, String> oluşturun
// TODO: getEntry() kullanarak kayıt girişini yazdırın
}
}
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ı