Menu
Coddy logo textTech

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);
challenge icon

Görev

Kolay

Generic 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, T türünde özel bir item alanına ve başlangıçta false olan özel bir wrapped (boolean) alanına sahip olmalıdır. Öğeyi kabul eden bir yapıcı (constructor), öğeyi döndüren bir getItem() metodu, wrapped değerini true olarak ayarlayan bir wrap() metodu ve paketlenme durumunu döndüren bir isWrapped() metodu ekleyin. Paketlenme durumuna bağlı olarak [item] (wrapped) veya [item] (unwrapped) döndüren bir getStatus() 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, K türünde özel bir recipient alanına ve V türünde özel bir gift alanına sahip olmalıdır. Her iki değeri de kabul eden bir yapıcı, getRecipient() ve getGift() getter metotlarını ve şu formatı döndüren bir getEntry() 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
    }
}
quiz iconKendini test et

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