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ı gerekir. Bir generic metod, herhangi bir sınıf düzeyindeki generic yapılardan bağımsız olarak kendi tür parametresini tanımlar.

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

Değiştiriciler ile dönüş türü 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, bir generic sınıf oluşturmadan esnek ve yeniden kullanılabilir işlemlere ihtiyaç duyduğunuz yardımcı sınıflarda özellikle yararlı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 ve ilk sayı değer olacak şekilde
    • Bir kez ilk sayı etiket ve 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!

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