Sobes.tech
Junior

Kas yra 'protected' prieigos modifikatorius programavimo kalboje ir kada jį reikėtų naudoti?

sobes.tech AI

Atsakymas iš AI

protected — tai prieigos modifikatorius, leidžiantis klasės nariams (laukeliai, metodai) būti prieinamiems pačioje klasėje, paveldinčiose klasėse (net jei jos yra kitame pakete) ir visuose to paties paketo klasėse.

Naudojimas:

Naudojamas, kai reikia suteikti prieigą prie klasės narių tik jos paveldėtojams ir kitoms to paties paketo klasėms, slepiant juos nuo išorinio pasaulio už šio paketo ribų ir paveldėjimo hierarchijos.

Pavyzdžiai:

  • Kai tėvinė klasė turi laukus ar metodus, kurie yra jos vidinės realizacijos dalis, bet yra būtini funkcionalumo plėtimui paveldėtosiose klasėse.

    public class Animal {
        protected String name; // prieinama paveldėtojams ir toms pačioms paketo klasėms
    
        protected void eat() { // prieinama paveldėtojams ir toms pačioms paketo klasėms
            System.out.println(name + " is eating.");
        }
    }
    
    public class Dog extends Animal {
        public void bark() {
            System.out.println(name + " is barking."); // prieiga prie protected lauko name
            eat(); // prieiga prie protected metodo eat()
        }
    }
    
  • Kai pakete yra grupė klasių, kurios yra glaudžiai susijusios, ir joms reikia prieigos prie viena kitos vidinių elementų, bet šie elementai turi būti slepiami nuo kitų paketų klasių. Tokiu atveju protected veikia kaip numatytasis (package-private) modifikatorius toms pačioms paketų klasėms, bet papildomai atveria prieigą paveldėtojams iš bet kurio paketo.

    // com.example.core paketas
    package com.example.core;
    
    public class BaseConfig {
        protected int threshold = 10; // prieinama klasėms iš com.example.core ir paveldėtojams iš bet kurio paketo
    }
    
    // com.example.app paketas (gali būti kitame pakete)
    package com.example.app;
    
    import com.example.core.BaseConfig;
    
    public class AppConfig extends BaseConfig {
        public void displayThreshold() {
            System.out.println("Threshold: " + threshold); // prieiga prie protected lauko iš kito paketo
        }
    }
    
    // com.example.core paketas
    package com.example.core;
    
    public class RelatedConfig {
         public void printBaseThreshold(BaseConfig config) {
             System.out.println("Base Threshold from RelatedConfig: " + config.threshold); // prieiga prie protected lauko to paties paketo
         }
    }
    

Venkite pernelyg didelio protected naudojimo, nes tai gali apsunkinti refaktoringą ir pažeisti inkapsuliaciją, leidžiant paveldėtojams ar toms pačioms paketų klasėms tiesiogiai manipuliuoti objekto vidiniu būsenos. Geriau naudoti private su viešais getter/setter metodais, jei tiesioginė paveldėjimas ir prieiga prie vidinės realizacijos nėra pagrindinis tikslas.