Menu
Coddy logo textTech

Generic Metotlar

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 55 / 87.

Generic sınıflar tüm sınıfların farklı türlerle çalışmasını sağlarken, bazen sadece tek bir metodun generic olmasına ihtiyaç duyarsınız. Bir generic metod, herhangi bir sınıf düzeyindeki generic yapılardan bağımsız olarak kendi tür parametresini bildirir.

Tür parametresi, metot imzasında dönüş türünden önce görünür:

public class Utility {
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }
}

String[] names = {"Alice", "Bob"};
Integer[] numbers = {1, 2, 3};

Utility.printArray(names);    // String[] ile çalışır
Utility.printArray(numbers);  // Integer[] ile çalışır

Belirleyiciler (modifiers) ile dönüş türü (return type) arasına yerleştirilen <T> ifadesine dikkat edin. Bu, T'yi bu özel metot için bir tür parametresi olarak bildirir. Derleyici, gerçek türü geçirdiğiniz argümanlardan çıkarır.

Generic metotlar aynı zamanda generic türü de döndürebilir:

public static <T> T getFirst(T[] array) {
    if (array.length > 0) {
        return array[0];
    }
    return null;
}

String first = getFirst(new String[]{"a", "b"});  // "a" döndürür

Gerektiğinde birden fazla tür parametresi kullanabilirsiniz:

public static <K, V> void printPair(K key, V value) {
    System.out.println(key + ": " + value);
}

printPair("Age", 25);        // String ve Integer
printPair(1, "First");       // Integer ve String

Generic metotlar, generic bir sınıf oluşturmadan esnek ve yeniden kullanılabilir işlemlere ihtiyaç duyduğunuz yardımcı sınıflarda (utility classes) özellikle kullanışlıdır.

challenge icon

Görev

Kolay

Genel metotların esnekliğini sergileyen bir yardımcı araç seti oluşturalım. Herhangi bir tiple çalışan yeniden kullanılabilir metotlara sahip bir sınıf oluşturacak ve genel metotların genel sınıflardan bağımsız olarak nasıl var olabileceğini göstereceksiniz.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • ArrayUtils.java: Dizilerle çalışmak için genel metotlar içeren bir yardımcı sınıf oluşturun. Sınıfınız üç adet statik genel metoda sahip olmalıdır:

    getLast - T tipinde bir dizi alan ve son elemanı döndüren genel bir metot. Eğer dizi boşsa, null döndürün.

    swap - T tipinde bir dizi ve iki tam sayı indeksi alan, ardından bu konumlardaki elemanların yerini değiştiren genel bir metot. Bu metot herhangi bir değer döndürmez.

    printWithLabel - K ve V olmak üzere iki tip parametresine sahip genel bir metot. K tipinde bir etiket ve V tipinde bir değer alır, ardından bunları şu formatta yazdırır: [label]: [value]

  • Main.java: Genel metotlarınızı işe koşun! Dört girdi alacaksınız: iki kelime (String) ve iki sayı (tam sayı).

    İlk olarak, her iki kelimeyi de içeren bir String[] dizisi oluşturun. Son elemanı almak için getLast metodunu kullanın ve şunu yazdırın: Last word: [result]

    Ardından, her iki sayıyı da içeren bir Integer[] dizisi oluşturun. 0 ve 1 indekslerindeki elemanları takas etmek için swap metodunu çağırın, ardından şunu yazdırın: After swap: [first], [second]

    Son olarak, printWithLabel metodunu iki kez çağırarak iki parametreli genel metodu gösterin:

    • Bir kez ilk kelime etiket, ilk sayı değer olacak şekilde
    • Bir kez ilk sayı etiket, ikinci kelime değer olacak şekilde

Sırasıyla dört girdi alacaksınız: ilk kelime, ikinci kelime, ilk sayı, ikinci sayı.

Her metodun dönüş tipinden önce <T> veya <K, V> ile kendi tip parametrelerini nasıl bildirdiğine dikkat edin. Derleyici, gerçek tipleri geçirdiğiniz argümanlardan çıkarır; metotları çağırırken bunları açıkça belirtmenize gerek yoktur!

Kopya kağıdı

Bir generic metot, herhangi bir sınıf düzeyindeki generic'ten bağımsız olarak kendi tür parametresini bildirir. Tür parametresi, metot imzasında dönüş türünden önce görünür.

Temel generic metot sözdizimi:

public static <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

<T>, niteleyiciler ile dönüş türü arasına yerleştirilir. Derleyici, gerçek türü geçirdiğiniz argümanlardan çıkarır.

Generic metotlar generic türü döndürebilir:

public static <T> T getFirst(T[] array) {
    if (array.length > 0) {
        return array[0];
    }
    return null;
}

Birden fazla tür parametresi kullanılabilir:

public static <K, V> void printPair(K key, V value) {
    System.out.println(key + ": " + value);
}

printPair("Age", 25);        // String and Integer
printPair(1, "First");       // Integer and String

Generic metotlar, generic bir sınıf oluşturmadan esnek ve yeniden kullanılabilir işlemler için yardımcı (utility) sınıflarda kullanışlıdır.

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String firstWord = scanner.nextLine();
        String secondWord = scanner.nextLine();
        int firstNumber = scanner.nextInt();
        int secondNumber = scanner.nextInt();
        
        // TODO: Her iki kelimeyi de içeren bir String[] dizisi oluşturun
        
        // TODO: Son öğeyi almak için ArrayUtils.getLast kullanın
        // Yazdır: "Last word: [result]"
        
        // TODO: Her iki sayıyı da içeren bir Integer[] dizisi oluşturun
        
        // TODO: 0 ve 1 indekslerindeki öğeleri değiştirmek için ArrayUtils.swap çağırın
        // Yazdır: "After swap: [first], [second]"
        
        // TODO: firstWord etiket ve firstNumber değer olacak şekilde ArrayUtils.printWithLabel çağırın
        
        // TODO: firstNumber etiket ve secondWord değer olacak şekilde ArrayUtils.printWithLabel çağı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