0Pricing
Java Academy · Ders

PECS İlkesi

Üretici Extends, Tüketici Super

PECS İlkesi, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. 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.

PECS Ne Anlama Gelir

PECS, Üretici Extends, Tüketici Super anlamına gelir. Joshua Bloch'un Effective Java kitabından gelen bir akılda tutma yöntemidir.

  • Bir parametre T üretiyorsa (parametreden okuyorsanız) ? extends T kullanın.
  • Bir parametre T tüketiyorsa (parametreye yazıyorsanız) ? super T kullanın.
public class Main {
    public static void main(String[] args) {
        System.out.println("Producer Extends, Consumer Super");
    }
}

Klasik copy Yöntemi

Klasik PECS örneği bir copy yöntemidir. Kaynak üretir; bu nedenle ? extends T kullanır. Hedef tüketir; bu nedenle ? super T kullanır.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static <T> void copy(List<? extends T> src, List<? super T> dest) {
        for (T t : src) dest.add(t);
    }
    public static void main(String[] args) {
        List<Integer> src = List.of(1, 2, 3);
        List<Object> dest = new ArrayList<>();
        copy(src, dest);
        System.out.println(dest);
    }
}

İki Joker Karakter Neden Esneklik Sağlar

PECS sayesinde copy birçok tür birleşimiyle çalışır: Integer kaynağından Number veya Object hedefine, String kaynağından CharSequence hedefine kopyalama yapılabilir.

Joker karakterler olmasaydı türlerin tam olarak eşleşmesi gerekirdi; bu da yeniden kullanımı büyük ölçüde kısıtlardı.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static <T> void copy(List<? extends T> src, List<? super T> dest) {
        for (T t : src) dest.add(t);
    }
    public static void main(String[] args) {
        List<Integer> ints = List.of(10, 20);
        List<Number> nums = new ArrayList<>();
        copy(ints, nums);
        System.out.println(nums);
    }
}

Üretici Örneği

Koleksiyonundan yalnızca okuma yapan bir yöntem extends kullanmalıdır. Burada bir üreticinin toplamını hesaplıyoruz.

import java.util.List;

public class Main {
    static double sum(List<? extends Number> producer) {
        double total = 0;
        for (Number n : producer) total += n.doubleValue();
        return total;
    }
    public static void main(String[] args) {
        System.out.println(sum(List.of(1, 2, 3)));
        System.out.println(sum(List.of(1.1, 2.2)));
    }
}

Tüketici Örneği

Koleksiyonuna yalnızca yazan bir yöntem super kullanmalıdır. Burada değerleri bir tüketiciye aktarıyoruz.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static void pushDigits(List<? super Integer> consumer) {
        for (int i = 0; i < 5; i++) consumer.add(i);
    }
    public static void main(String[] args) {
        List<Number> nums = new ArrayList<>();
        pushDigits(nums);
        System.out.println(nums);
    }
}

İki Rol Birden: Sade Bir Tür Kullanın

Bir parametre hem üretici hem tüketici ise joker karakter kullanmamalıdır.

Aynı listeyi okuyup yazan bir yöntem, kesin T türüne ihtiyaç duyar.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static <T> void rotate(List<T> list) {
        if (list.isEmpty()) return;
        T last = list.remove(list.size() - 1);
        list.add(0, last);
    }
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(List.of(1, 2, 3));
        rotate(list);
        System.out.println(list);
    }
}

Comparator içinde PECS

JDK, PECS'i her yerde uygular. Collections.max, Comparator<? super T> alır; çünkü karşılaştırıcı, T değerlerini karşılaştırmak üzere tüketir.

import java.util.Comparator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Comparator<Object> byHash = Comparator.comparingInt(Object::hashCode);
        List<String> words = List.of("a", "bb", "ccc");
        String max = java.util.Collections.max(words, byHash);
        System.out.println(max);
    }
}

Stream.collect içinde PECS

Birçok işlevsel arayüz PECS'i izler. Consumer<? super T>, daha geniş bir tür için yazılmış bir işleyiciyi kabul edebilir.

import java.util.List;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Consumer<Object> printer = o -> System.out.println("got: " + o);
        List<String> items = List.of("x", "y");
        items.forEach(printer); // forEach takes Consumer<? super T>
    }
}

Function Üreticileri ve Tüketicileri

Function<? super T, ? extends R> tam PECS biçimidir: girdi tüketilir (super), çıktı üretilir (extends).

Bu sayede bir dönüştürücü daha geniş girdileri kabul edip daha dar çıktılar döndürebilir.

import java.util.function.Function;

public class Main {
    static <T, R> R apply(Function<? super T, ? extends R> fn, T value) {
        return fn.apply(value);
    }
    public static void main(String[] args) {
        Function<Object, Integer> len = o -> o.toString().length();
        System.out.println(apply(len, "hello"));
    }
}

Dönüş Türleri: Joker Karakterlerden Kaçının

Dönüş türlerinde joker karakter kullanmayın. Bunlar çağıranları da joker karakterlerle uğraşmaya zorlayarak karmaşıklığı dışarıya taşır.

Somut bir tür döndürün; esneklik sağladıkları yerlerde joker karakterleri parametrelerde tutun.

import java.util.ArrayList;
import java.util.List;

public class Main {
    // Good: concrete return type
    static List<Number> doubled(List<? extends Number> src) {
        List<Number> out = new ArrayList<>();
        for (Number n : src) out.add(n.doubleValue() * 2);
        return out;
    }
    public static void main(String[] args) {
        System.out.println(doubled(List.of(1, 2, 3)));
    }
}

Eksiksiz Bir PECS Birleştirmesi

Hepsini bir araya getirelim: iki üreticiden okuyan ve tek bir tüketiciye yazan bir merge.

import java.util.ArrayList;
import java.util.List;

public class Main {
    static <T> void merge(List<? extends T> a, List<? extends T> b, List<? super T> out) {
        for (T t : a) out.add(t);
        for (T t : b) out.add(t);
    }
    public static void main(String[] args) {
        List<Integer> a = List.of(1, 2);
        List<Integer> b = List.of(3, 4);
        List<Number> out = new ArrayList<>();
        merge(a, b, out);
        System.out.println(out);
    }
}

Kısa Kontrol

PECS kuralını uygulayın.

Özet

PECS ilkesini öğrendiniz:

  • Üretici Extends: salt okunur parametreler ? extends T kullanır.
  • Tüketici Super: salt yazılır parametreler ? super T kullanır.
  • İki role sahip parametreler sade bir tür parametresi kullanır.
  • Dönüş türlerinde joker karakterlerden kaçının.

Sırada bu fikirleri gerçek API tasarımına uygulamak var.

public class Main {
    public static void main(String[] args) {
        System.out.println("PECS recap: Producer Extends, Consumer Super");
    }
}

Sıkça Sorulan Sorular

“PECS İlkesi” dersi ücretsiz mi?

Evet — “PECS İlkesi” 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.

“PECS İlkesi” dersinde ne öğreneceğim?

Üretici Extends, Tüketici Super 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 3. dersidir.

“PECS İlkesi” 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

  1. Üst Sınırlandırılmış Joker Türler
  2. Alt Sınırlandırılmış Joker Türler
  3. PECS İlkesi
  4. API'lerde Joker Türler
← Java Academy Sayfasına Dön