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.

Genel sınıflar tüm sınıfların farklı türlerle çalışmasını sağlarken, bazen yalnızca tek bir yöntemin genel olması gerekir. Genel bir yöntem, sınıf düzeyindeki genellemelerden 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

Değiştiriciler ile dönüş türü arasına yerleştirilen <T> ifadesine dikkat edin. Bu, T öğesini yalnızca bu yöntem için bir tür parametresi olarak tanımlar. Derleyici, gerçek türü ilettiğiniz bağımsız değişkenlerden çıkarır.

Jenerik metotlar ayrıca jenerik 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 kullanabilirsin:

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

Jenerik metotlar, jenerik bir sınıf oluşturmadan esnek ve yeniden kullanılabilir işlemlere ihtiyaç duyduğun yardımcı sınıflarda özellikle kullanışlıdır.

challenge icon

Görev

Kolay

Jenerik yöntemlerin esnekliğini sergileyen bir yardımcı araç seti oluşturalım. Her türle çalışan, yeniden kullanılabilir yöntemlere sahip bir sınıf oluşturacak ve jenerik yöntemlerin jenerik sınıflardan bağımsız olarak var olabileceğini göstereceksin.

Kodunu iki dosya arasında düzenleyeceksin:

  • ArrayUtils.java: Dizilerle çalışmak için jenerik yöntemler içeren bir yardımcı sınıf oluştur. Sınıfında üç statik jenerik yöntem bulunmalı:

    getLast - T türünde bir dizi alan ve son öğeyi döndüren bir jenerik yöntem. Dizi boşsa null döndür.

    swap - T türünde bir dizi ve iki tamsayı dizini alan, ardından bu konumlardaki öğeleri yer değiştiren bir jenerik yöntem. Bu yöntem hiçbir şey döndürmez.

    printWithLabel - K ve V adlı iki tür parametresine sahip bir jenerik yöntem. K türünde bir etiket ve V türünde bir değer alır, ardından bunları şu biçimde yazdırır: [label]: [value]

  • Main.java: Jenerik yöntemlerini kullan! Dört girdi alacaksın: iki sözcük (String) ve iki sayı (tamsayı).

    İlk olarak, her iki sözcüğü içeren bir String[] dizisi oluştur. Son öğeyi almak için getLast yöntemini kullan ve şunu yazdır: Last word: [result]

    Ardından, her iki sayıyı içeren bir Integer[] dizisi oluştur. 0 ve 1 dizinlerindeki öğeleri yer değiştirmek için swap yöntemini çağır, sonra şunu yazdır: After swap: [first], [second]

    Son olarak, printWithLabel yöntemini iki kez çağırarak iki parametreli jenerik yöntemi göster:

    • Bir kez, ilk sözcüğü etiket ve ilk sayıyı değer olarak kullan
    • Bir kez, ilk sayıyı etiket ve ikinci sözcüğü değer olarak kullan

Dört girdiyi şu sırayla alacaksın: ilk sözcük, ikinci sözcük, ilk sayı, ikinci sayı.

Her yöntemin, dönüş türünden önce <T> veya <K, V> ile kendi tür parametre(ler)ini nasıl bildirdiğine dikkat et. Derleyici, aktardığın bağımsız değişkenlerden gerçek türleri çıkarır: yöntemleri çağırırken bunları açıkça belirtmene gerek yok!

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 içeren bir String[] dizisi oluştur
        
        // TODO: Son öğeyi almak için ArrayUtils.getLast kullan
        // Yazdır: "Last word: [result]"
        
        // TODO: Her iki sayıyı içeren bir Integer[] dizisi oluştur
        
        // TODO: 0 ve 1 indekslerindeki öğeleri takas etmek için ArrayUtils.swap çağır
        // Yazdır: "After swap: [first], [second]"
        
        // TODO: firstWord'ü etiket ve firstNumber'ı değer olarak kullanarak ArrayUtils.printWithLabel çağır
        
        // TODO: firstNumber'ı etiket ve secondWord'ü değer olarak kullanarak ArrayUtils.printWithLabel çağı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