Sobes.tech
Middle+

Ի՞նչ է PECS սկզբունքը և ինչպես է այն կիրառվում Java-ում։

sobes.tech AI

Պատասխան AI-ից

PECS սկզբունքը (Producer Extends Consumer Super) — դա հիշողության կանոն է, որը որոշում է, երբ օգտագործել extends և super բանալի բառերը Java գեներիկների wildcard-տիպերի հետ աշխատելիս:

  • Producer (Արտադրող): Երբ օգտագործում եք գեներիկ պարամետր՝ տվյալների ստանալու համար (միավորներ հանում եք հավաքածուից), օգտագործեք extends-ով wildcard։ Հավաքածուն հանդես է գալիս որպես տվյալների արտադրող։ ? extends T տիպը նշանակում է "յուրաքանչյուր T կամ նրա ենթատիպ"։ Դուք կարող եք անվտանգ կարդալ տարրերը որպես T (կամ նրա վերադաս), բայց չեք կարող ավելացնել տարրեր այդ հավաքածուին (բացառությամբ null

  • Consumer (Սպառող): Երբ օգտագործում եք գեներիկ պարամետր՝ տվյալների ավելացման համար (ներմուծում եք տարրեր հավաքածուին), օգտագործեք super-ով wildcard։ Հավաքածուն հանդես է գալիս որպես տվյալների սպառող։ ? super T տիպը նշանակում է "յուրաքանչյուր T կամ նրա վերադաս"։ Դուք կարող եք անվտանգ ավելացնել T տիպի կամ նրա ենթատիպերի տարրեր այդ հավաքածուին, բայց կարդալիս ստանում եք Object։

Java-ում կիրառումը:

Օգտագործվում է wildcard-տիպերով (?)՝ API-ի ճկունությունը բարձրացնելու համար, որոնք աշխատում են հավաքածուներով կամ այլ գեներացված տիպերով, թույլ տալով նրանց աշխատել ավելի լայն տիպերի շրջանակում՝ պահպանելով տիպի անվտանգությունը։

Օրինակներ:

// Արտադրող օրինակ
// printAll մեթոդը կարդում է List-ից
public void printAll(List<? extends Number> list) {
    // Կարող ենք կարդալ տարրերը որպես Number (կամ Object)
    for (Number num : list) {
        System.out.println(num);
    }
    // Չենք կարող ավելացնել տարրեր (բացառությամբ null)
    // list.add(123); // Կոմպիլյատորային սխալ
}

// Սպառող օրինակ
// addNumbers մեթոդը ավելացնում է List-ին
public void addNumbers(List<? super Integer> list) {
    // Կարող ենք ավելացնել Integer կամ նրա ենթատիպեր
    list.add(1);
    list.add(new Integer(2));
    // list.add(new Double(3.0)); // Կոմպիլյատորային սխալ

    // Կարդալիս ստանում ենք Object
    Object o = list.get(0);
}