API'lerde Joker Türler
Esnek genel yöntemler tasarlayın
API'lerde Joker Türler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Esnek Yöntemler Tasarlama
Joker karakterler temel olarak API tasarımcıları için bir araçtır. Doğru yerde kullanılan bir joker karakter, çağıranların dönüştürme işlemleri yapmadan daha fazla tür aktarmasını sağlar.
Amaç, çağıranlar için en yüksek esnekliği ve içeride tam tür güvenliğini sağlamaktır.
import java.util.List;
public class Main {
static double total(List<? extends Number> items) {
double sum = 0;
for (Number n : items) sum += n.doubleValue();
return sum;
}
public static void main(String[] args) {
System.out.println(total(List.of(1, 2, 3)));
System.out.println(total(List.of(1.5, 2.5)));
}
}Sınırsız Joker Karakterler
List<?>, sınırsız bir joker karakterdir: bilinmeyen bir türden oluşan listedir.
Yönteminiz öğe türüyle ilgilenmiyorsa, örneğin öğeleri sayarken veya boşluğu denetlerken kullanın.
import java.util.List;
public class Main {
static int size(List<?> any) {
return any.size();
}
public static void main(String[] args) {
System.out.println(size(List.of("a", "b")));
System.out.println(size(List.of(1, 2, 3)));
}
}List<?> ve List<Object> Karşılaştırması
Bunlar farklıdır. List<Object> yalnızca Object olarak bildirilmiş bir listeyi kabul eder. List<?> ise her türden listeyi kabul eder.
Bir List<String> listesini List<?> parametresine aktarabilirsiniz; ancak List<Object> parametresine aktaramazsınız.
import java.util.List;
public class Main {
static void printAll(List<?> list) {
for (Object o : list) System.out.println(o);
}
public static void main(String[] args) {
List<String> names = List.of("Ada", "Linus");
printAll(names); // works; List<Object> would reject this
}
}Tür Parametresi Ne Zaman Daha Açık Olur
Öğe türüne birden fazla kez başvurmanız gerekiyorsa, adlandırılmış bir tür parametresi joker karakterden daha anlaşılırdır.
void swap(List<?> l, int i, int j) (özel bir yardımcı yöntem gerektirir) ile temiz bir genel sürümü karşılaştırın.
import java.util.ArrayList;
import java.util.List;
public class Main {
static <T> void swap(List<T> list, int i, int j) {
T tmp = list.get(i);
list.set(i, list.get(j));
list.set(j, tmp);
}
public static void main(String[] args) {
List<String> list = new ArrayList<>(List.of("a", "b", "c"));
swap(list, 0, 2);
System.out.println(list);
}
}Yardımcı Yöntemle Tür Yakalama Tekniği
Genel bir API'nin List<?> kullanması gerekiyorsa, joker karakteri yakalamak için özel bir genel yardımcı yönteme devredebilirsiniz.
Yardımcı yöntem türü T olarak adlandırır; böylece listeye yeniden yazabilir.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void reverse(List<?> list) { reverseHelper(list); }
private static <T> void reverseHelper(List<T> list) {
for (int i = 0, j = list.size() - 1; i < j; i++, j--) {
T tmp = list.get(i);
list.set(i, list.get(j));
list.set(j, tmp);
}
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4));
reverse(list);
System.out.println(list);
}
}Gerçek Bir API'de Üretici Parametreleri
Her uyumlu kaynaktan veri alan bir addAll tasarlamak, kaynak üzerinde bir üst sınır kullanır.
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Main {
static <T> void addAll(List<T> target, Collection<? extends T> source) {
for (T t : source) target.add(t);
}
public static void main(String[] args) {
List<Number> nums = new ArrayList<>();
addAll(nums, List.of(1, 2, 3));
System.out.println(nums);
}
}Gerçek Bir API'de Tüketici Parametreleri
Sonuçları yazan bir hedef API'si, çağıranların daha geniş kapsayıcılar sağlayabilmesi için hedef üzerinde bir alt sınır kullanır.
import java.util.ArrayList;
import java.util.List;
public class Main {
static <T> void repeat(T value, int times, List<? super T> sink) {
for (int i = 0; i < times; i++) sink.add(value);
}
public static void main(String[] args) {
List<Object> out = new ArrayList<>();
repeat("hi", 3, out);
System.out.println(out);
}
}İç İçe Genel Türlerle Joker Karakterler
İç içe genel türler genellikle joker karakterlere ihtiyaç duyar. Her türden liste listesini kabul eden bir yöntem List<? extends List<?>> kullanır.
import java.util.List;
public class Main {
static int countAll(List<? extends List<?>> lists) {
int total = 0;
for (List<?> inner : lists) total += inner.size();
return total;
}
public static void main(String[] args) {
System.out.println(countAll(List.of(List.of(1, 2), List.of("a", "b", "c"))));
}
}Aşırı Genellemeden Kaçınma
Her yöntemin joker karakterlere ihtiyacı yoktur. Çağıranlar her zaman tek bir tür aktaracaksa sade bir parametre daha anlaşılırdır.
Joker karakterleri önceden eklemek yerine, değişmezlik yüzünden gerçekten engellenen çağıranlar olduğunu gördüğünüzde ekleyin.
import java.util.List;
public class Main {
// Simple and clear; no wildcard needed for this internal use
static String joinStrings(List<String> parts) {
return String.join(", ", parts);
}
public static void main(String[] args) {
System.out.println(joinStrings(List.of("a", "b", "c")));
}
}Joker Karakter Niyetini Belgeleme
Bir joker karakter niyeti belirtir. ? extends T, okuyuculara “Ben yalnızca bunu okurum” der. ? super T ise “Ben yalnızca buna yazarım” anlamına gelir.
Doğru joker karakteri seçmek, sözleşmeyi de zorunlu kılan, kendi kendini belgeleyen bir kod yazma biçimidir.
import java.util.ArrayList;
import java.util.List;
public class Main {
// src: read-only producer; dest: write-only consumer
static <T> void transfer(List<? extends T> src, List<? super T> dest) {
for (T t : src) dest.add(t);
}
public static void main(String[] args) {
List<Number> dest = new ArrayList<>();
transfer(List.of(1, 2), dest);
System.out.println(dest);
}
}Genel Bir Stack API'si
Bloch'un ünlü yığın örneği: pushAll bir üreticiden tüketir (extends), popAll ise bir tüketiciye üretir (super).
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Deque;
import java.util.ArrayList;
import java.util.List;
public class Main {
static class Stack<E> {
private final Deque<E> items = new ArrayDeque<>();
void pushAll(Collection<? extends E> src) { for (E e : src) items.push(e); }
void popAll(Collection<? super E> dst) { while (!items.isEmpty()) dst.add(items.pop()); }
}
public static void main(String[] args) {
Stack<Integer> s = new Stack<>();
s.pushAll(List.of(1, 2, 3));
List<Number> out = new ArrayList<>();
s.popAll(out);
System.out.println(out);
}
}Kısa Kontrol
API tasarımı sezgilerinizi sınayın.
Özet
Joker karakterlerle API tasarlamayı öğrendiniz:
- Türden bağımsız, salt okunur yöntemler için
List<?>kullanın. - Esneklik için parametrelere PECS uygulayın.
- Bir joker karakter üzerinden yazmanız gerektiğinde özel yardımcı yöntemle tür yakalama tekniğini kullanın.
- Dönüş türlerinde joker karakterlerden kaçının ve aşırı genelleme yapmayın.
Joker karakterler ve PECS kursunu tamamladınız.
public class Main {
public static void main(String[] args) {
System.out.println("Wildcards in APIs course complete");
}
}Sıkça Sorulan Sorular
“API'lerde Joker Türler” dersi ücretsiz mi?
Evet — “API'lerde Joker Türler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“API'lerde Joker Türler” dersinde ne öğreneceğim?
Esnek genel yöntemler tasarlayın Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“API'lerde Joker Türler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Üst Sınırlandırılmış Joker Türler
- Alt Sınırlandırılmış Joker Türler
- PECS İlkesi
- API'lerde Joker Türler