Generic Sınıflar
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 54 / 87.
Artık generic'lerin neden yararlı olduğunu anladığına göre, kendi generic sınıfını oluşturalım. Bir generic sınıf, sınıf adından sonra açılı parantezler içinde bir veya daha fazla tür parametresi bildirir; bu parametreler daha sonra sınıf genelinde kullanılabilir.
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şturduğunuzda gerçek bir türle değiştirilen bir yer tutucudur. any adını kullanabilirsiniz, ancak tek büyük harfler gelenekseldir: Tür için T, Öğe için E, Anahtar için K, Değer için V.
Genel bir sınıfı örneklendirirken gerçek türü köşeli parantezler içinde belirtirsiniz:
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get(); // Tip dönüşümüne gerek yok
Box<Integer> intBox = new Box<>();
intBox.set(42);
Integer num = intBox.get();Sağ taraftaki <> (elmas operatörüne) dikkat et: Java, türü bildirimden çıkarır. Birden fazla türle çalışması gereken sınıflar için birden çok tür parametresi de kullanabilirsin:
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
KolayJenerik sınıfların gücünü sergileyen bir hediye kayıt sistemi oluşturalım. Her türden hediye öğesini depolayabilen esnek bir depolama sistemi ve birden çok tür parametresi kullanarak hediye adlarını ayrıntılarıyla eşleştiren bir kayıt defteri oluşturacaksın.
Kodunu üç dosyaya ayıracaksın:
GiftBox.java: Her türden hediyeyi sarabilen jenerik bir sınıf oluştur.GiftBox<T>sınıfındaTtüründe özel biritemalanı ve başlangıç değerifalseolan özel birwrapped(boolean) alanı bulunmalı. Öğeyi kabul eden bir oluşturucu, öğeyi döndüren birgetItem()yöntemi, wrapped değerini true olarak ayarlayan birwrap()yöntemi ve wrapped durumunu döndüren birisWrapped()yöntemi ekle. Sarılma durumuna bağlı olarak[item] (wrapped)veya[item] (unwrapped)döndüren birgetStatus()yöntemi ekle.Registry.java: Bir alıcıyı hediyesiyle eşleştiren, iki tür parametresine sahip jenerik bir sınıf oluştur.Registry<K, V>sınıfındaKtüründe özel birrecipientalanı veVtüründe özel birgiftalanı bulunmalı. Her iki değeri kabul eden bir oluşturucu,getRecipient()vegetGift()alıcı yöntemleri ve şu değeri döndüren birgetEntry()yöntemi ekle:[recipient] -> [gift]Main.java: Hediye kayıt sistemini çalışır hâle getir! Üç girdi alacaksın: alıcının adı (String), hediye açıklaması (String) ve hediye değeri (doları temsil eden tamsayı).İlk olarak, hediye açıklamasını içeren bir
GiftBox<String>oluştur.wrap()yöntemini kullanarak hediyeyi sar, ardından durumunu yazdır.Ardından, hediye değerini (bir hediye kartı tutarını temsil eder) içeren bir
GiftBox<Integer>oluştur. Bunu sarma: sarılmamış olduğunu göstermek için durumunu yazdır.Son olarak, alıcının adını hediye açıklamasıyla eşleştiren bir
Registry<String, String>oluştur ve kayıt girdisini yazdır.
Üç girdiyi şu sırayla alacaksın: alıcının adı, hediye açıklaması ve hediye değeri (tamsayı olarak).
Aynı GiftBox sınıfının hem String hem de Integer türleriyle sorunsuz biçimde çalıştığına dikkat et: jeneriklerin güzelliği budur! Ayrıca Registry sınıfı, birden çok tür parametresinin herhangi iki tür arasında nasıl esnek eşleştirmeler oluşturmanı sağladığını gösterir.
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ştur
// TODO: wrap() metodunu kullanarak onu sar
// TODO: getStatus() kullanarak durumunu yazdır
// TODO: Hediye değerini içeren bir GiftBox<Integer> oluştur
// TODO: Bunu sarma - durumunu yazdır (sarılmamış göstermelidir)
// TODO: Alıcıyı hediye açıklamasıyla eşleştiren bir Registry<String, String> oluştur
// TODO: getEntry() kullanarak kayıt girdisini yazdır
}
}
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