Sobes.tech
Middle+

PECS tamoyili nima va u Java'da qanday qo'llaniladi?

sobes.tech AI

AIdan javob

PECS (Producer Extends Consumer Super) prinsipi, Java genetiklarida wildcard tiplari bilan ishlashda extends va super kalit so'zlaridan qachon foydalanishni belgilovchi eslab qolish qoidasi hisoblanadi.

  • Producer (Ishlab chiqaruvchi): Agar siz generik parametrni ma'lumotlarni olish uchun (koleksiyadan elementlarni chiqarish) ishlatayotgan bo'lsangiz, extends bilan wildcarddan foydalaning. Koleksiya ma'lumot ishlab chiqaruvchi sifatida ishlaydi. ? extends T tipi "T yoki uning subklassiga" teng bo'lgan har qanday turni anglatadi. Siz elementlarni xavfsiz tarzda T (yoki uning superklassiga) sifatida o'qishingiz mumkin, lekin bunday kolleksiyaga elementlar qo'sha olmaysiz (null bundan mustasno).

  • Consumer (Iste'molchi): Agar siz generik parametrni ma'lumotlarni qo'shish uchun (koleksiyaga elementlar qo'yish) ishlatayotgan bo'lsangiz, super bilan wildcarddan foydalaning. Koleksiya ma'lumot iste'molchi sifatida ishlaydi. ? super T tipi "T yoki uning superklassiga" teng bo'lgan har qanday turni anglatadi. Siz T turidagi elementlarni (yoki uning subklasslarini) xavfsiz qo'shishingiz mumkin, lekin o'qishda ularni Object sifatida olasiz.

Java'da qo'llanilishi:

Wildcard tiplari (?) bilan ishlatiladi, bu API'larning kolleksiyalar yoki boshqa generik tiplari bilan ishlashda moslashuvchanlikni oshiradi, ular kengroq tur doirasida ishlash imkonini beradi va tur xavfsizligini saqlab qoladi.

Misollar:

// Producer misoli
// printAll metodi List'dan o'qiydi
public void printAll(List<? extends Number> list) {
    // Elementlarni Number (yoki Object) sifatida o'qish mumkin
    for (Number num : list) {
        System.out.println(num);
    }
    // Elementlar qo'sha olmaymiz (null bundan mustasno)
    // list.add(123); // Kompilatsiya xatosi
}

// Consumer misoli
// addNumbers metodi List'ga elementlar qo'shadi
public void addNumbers(List<? super Integer> list) {
    // Integer yoki uning subklasslarini qo'shish mumkin
    list.add(1);
    list.add(new Integer(2));
    // list.add(new Double(3.0)); // Kompilatsiya xatosi

    // O'qishda Object sifatida olamiz
    Object o = list.get(0);
}