Sobes.tech
Junior

Čo je to prístupový modifikátor 'protected' v programovacom jazyku a v akých prípadoch by sa mal použiť?

sobes.tech AI

Odpoveď od AI

protected — je modifikátor prístupu, ktorý umožňuje členom triedy (poliam, metódam) byť dostupnými vnútri samotnej triedy, v dedičných triedach (aj keď sú v inom balíku) a vo všetkých triedach nachádzajúcich sa v tom istom balíku.

Použitie:

Používa sa, keď je potrebné poskytnúť prístup k členom triedy iba jej dedičom a ďalším triedam v tom istom balíku, skrývajúc ich pred vonkajším svetom mimo tohto balíka a hierarchiu dedičstva.

Príklady scenárov použitia:

  • Keď rodičovská trieda obsahuje polia alebo metódy, ktoré sú súčasťou jej vnútorného implementácie, ale sú nevyhnutné na rozšírenie funkčnosti v dedičných triedach.

    public class Animal {
        protected String name; // Dostupné dedičom a triedam v tom istom balíku
    
        protected void eat() { // Dostupné dedičom a triedam v tom istom balíku
            System.out.println(name + " is eating.");
        }
    }
    
    public class Dog extends Animal {
        public void bark() {
            System.out.println(name + " is barking."); // Prístup k protected poľu name
            eat(); // Prístup k protected metóde eat()
        }
    }
    
  • Keď je v balíku skupina tried, ktoré sú tesne prepojené medzi sebou, a je potrebné, aby mali prístup k vnútorným prvkom navzájom, ale tieto prvky chcú skrývať pred triedami z iných balíkov. V takom prípade protected funguje podobne ako predvolený (package-private) modifikátor pre triedy v tom istom balíku, ale zároveň otvára prístup pre dedičov z ľubovoľného balíka.

    // Balík com.example.core
    package com.example.core;
    
    public class BaseConfig {
        protected int threshold = 10; // Dostupný triedam v com.example.core a dedičom z ľubovoľného balíka
    }
    
    // Balík com.example.app (môže byť v inom balíku)
    package com.example.app;
    
    import com.example.core.BaseConfig;
    
    public class AppConfig extends BaseConfig {
        public void displayThreshold() {
            System.out.println("Threshold: " + threshold); // Prístup k protected poľu z iného balíka
        }
    }
    
    // Balík com.example.core
    package com.example.core;
    
    public class RelatedConfig {
         public void printBaseThreshold(BaseConfig config) {
             System.out.println("Base Threshold from RelatedConfig: " + config.threshold); // Prístup k protected poľu v tom istom balíku
         }
    }
    

Vyhýbajte sa nadmernému používaniu protected, pretože to môže sťažiť refaktoring a narušiť inkapsuláciu, umožňujúc dedičom alebo triedam v tom istom balíku priamo manipulovať s vnútorným stavom objektu. Uprednostňujte použitie private s verejnými getter/setter metódami, ak priame dedičstvo a prístup k vnútornej implementácii nie sú hlavným cieľom.