Sobes.tech
Middle+

Қоидаи PECS чист ва чӣ гуна дар Java истифода мешавад?

sobes.tech AI

Ҷавоб аз AI

Prinsipi PECS (Producer Extends Consumer Super) — bu Java genetiklərində wildcard tipləri ilə işləyərkən extendssuper açar sözlərinin nə zaman istifadə olunacağını müəyyən edən yadda saxlanılan qaydadır.

  • İstehsalçı (Producer): Əgər siz generik parametrdən məlumat almaq (koleksiyadan element çıxarmaq) üçün istifadə edirsinizsə, extends ilə wildcarddan istifadə edin. Koleksiya məlumat istehsalçı kimi fəaliyyət göstərir. ? extends T tipi, "T və ya onun alt sinfi" mənasını verir. Siz elementləri təhlükəsiz şəkildə T kimi (və ya onun superklası) oxuya bilərsiniz, lakin belə bir kolleksiyaya element əlavə edə bilməzsiniz (null istisna olmaqla).

  • İstehlakçı (Consumer): Əgər siz generik parametrdən məlumat əlavə etmək (elementləri kolleksiyaya qoymaq) üçün istifadə edirsinizsə, super ilə wildcarddan istifadə edin. Koleksiya məlumat istehlakçı kimi fəaliyyət göstərir. ? super T tipi, "T və ya onun superklası" mənasını verir. Siz təhlükəsiz şəkildə T tipli elementlər (və onun alt sinifləri) əlavə edə bilərsiniz, lakin oxuma zamanı onları Object kimi alacaqsınız.

Java-da tətbiqi:

Wildcard tipləri (?) ilə istifadə olunur, bu API-lərin kolleksiyalar və ya digər generik tiplərlə işləməkdə elastikliyini artırır, onlara daha geniş tip diapazonu ilə işləməyə imkan verir və tip təhlükəsizliyini qoruyur.

Nümunələr:

// Producer nümunəsi
// printAll metodu List-dən oxuyur
public void printAll(List<? extends Number> list) {
    // Elementləri Number kimi (və ya Object) oxuya bilərik
    for (Number num : list) {
        System.out.println(num);
    }
    // Elementlər əlavə edə bilmərik (null istisna olmaqla)
    // list.add(123); // Kompilyasiya xətası
}

// Consumer nümunəsi
// addNumbers metodu List-ə elementlər əlavə edir
public void addNumbers(List<? super Integer> list) {
    // Integer və ya onun alt siniflərini əlavə edə bilərik
    list.add(1);
    list.add(new Integer(2));
    // list.add(new Double(3.0)); // Kompilyasiya xətası

    // Oxuma zamanı Object alırıq
    Object o = list.get(0);
}