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ışırBelirleyiciler (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ürGerektiğ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 StringGeneric 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.
Görev
KolayGenel 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-Ttipinde bir dizi alan ve son elemanı döndüren genel bir metot. Eğer dizi boşsa,nulldöndürün.swap-Ttipinde 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-KveVolmak üzere iki tip parametresine sahip genel bir metot.Ktipinde bir etiket veVtipinde 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çingetLastmetodunu 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çinswapmetodunu çağırın, ardından şunu yazdırın:After swap: [first], [second]Son olarak,
printWithLabelmetodunu 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 StringGeneric 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
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı