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ışırDeğ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ürGerektiğ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 StringJenerik 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.
Görev
KolayJenerik 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-Ttüründe bir dizi alan ve son öğeyi döndüren bir jenerik yöntem. Dizi boşsanulldöndür.swap-Ttü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-KveVadlı iki tür parametresine sahip bir jenerik yöntem.Ktüründe bir etiket veVtü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çingetLastyö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çinswapyöntemini çağır, sonra şunu yazdır:After swap: [first], [second]Son olarak,
printWithLabelyö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
}
}
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ıKendi başına pratik yap: Online Java derleyicisi