Sobes.tech
Middle+

PECS prinsipi nədir və Java-da necə tətbiq olunur?

sobes.tech Süni İntellekt

AI-dan cavab

PECS prinsipi (Producer Extends Consumer Super), Java nəsil növlərində wildcard tipləri ilə işləyərkən extendssuper açar sözlərindən nə zaman istifadə ediləcəyini 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ə wildcard istifadə edin. Koleksiya məlumat istehsalçısı 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ə wildcard istifadə edin. Koleksiya məlumat istehlakçısı 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 (və ya Object) kimi 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);
}