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.

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

Görev

Kolay

Jenerik 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ında T türünde özel bir item alanı ve başlangıç değeri false olan özel bir wrapped (boolean) alanı bulunmalı. Öğeyi kabul eden bir oluşturucu, öğeyi döndüren bir getItem() yöntemi, wrapped değerini true olarak ayarlayan bir wrap() yöntemi ve wrapped durumunu döndüren bir isWrapped() yöntemi ekle. Sarılma durumuna bağlı olarak [item] (wrapped) veya [item] (unwrapped) döndüren bir getStatus() 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ında K türünde özel bir recipient alanı ve V türünde özel bir gift alanı bulunmalı. Her iki değeri kabul eden bir oluşturucu, getRecipient() ve getGift() alıcı yöntemleri ve şu değeri döndüren bir getEntry() 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
    }
}
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

Kendi başına pratik yap: Online Java derleyicisi