Sobes.tech
Junior

Mis on 'protected' juurdepääsumu modifikaator programmeerimiskeeles ja millal seda tuleks kasutada?

sobes.tech AI

Vastus AI-lt

protected — see on juurdepääsirežiim, mis võimaldab klassi liikmetel (väljad, meetodid) olla kättesaadavad klassi enda sees, pärilikes klassides (isegi kui need asuvad teises paketis) ning kõigis samas paketis olevates klassides.

Rakendus:

Kasutatakse siis, kui soovitakse anda juurdepääs klassi liikmetele ainult selle pärilikele ja teistele samas paketis olevatele klassidele, varjates need välismaailma eest väljaspool seda paketti ja päriluse hierarhiat.

Näited kasutusstsenaariumidest:

  • Kui vanemklass sisaldab välju või meetodeid, mis on osa selle sisemisest teostusest, kuid on vajalikud funktsionaalsuse laiendamiseks pärilikes klassides.

    public class Animal {
        protected String name; // kättesaadav pärilikele ja samas paketis olevatele klassidele
    
        protected void eat() { // kättesaadav pärilikele ja samas paketis olevatele klassidele
            System.out.println(name + " is eating.");
        }
    }
    
    public class Dog extends Animal {
        public void bark() {
            System.out.println(name + " is barking."); // juurdepääs protected väljakule name
            eat(); // juurdepääs protected meetodile eat()
        }
    }
    
  • Kui paketis on rühm klasse, mis on tihedalt seotud ning neil on vaja juurdepääsu üksteise sisemistele elementidele, kuid need elemendid tuleb varjata teiste paketite klasside eest. Sellisel juhul töötab protected sarnaselt vaikimisi (package-private) modifikatorile samas paketis olevatele klassidele, kuid avab lisaks juurdepääsu pärilikele ka kõikidest pakettidest.

    // com.example.core paketis
    package com.example.core;
    
    public class BaseConfig {
        protected int threshold = 10; // kättesaadav klassidele com.example.core ning pärilikele igast paketist
    }
    
    // com.example.app paketis (võib olla teises paketis)
    package com.example.app;
    
    import com.example.core.BaseConfig;
    
    public class AppConfig extends BaseConfig {
        public void displayThreshold() {
            System.out.println("Threshold: " + threshold); // juurdepääs protected väljakule teises paketis
        }
    }
    
    // com.example.core paketis
    package com.example.core;
    
    public class RelatedConfig {
         public void printBaseThreshold(BaseConfig config) {
             System.out.println("Base Threshold from RelatedConfig: " + config.threshold); // juurdepääs protected väljakule samas paketis
         }
    }
    

Vältige liigset protected kasutamist, kuna see võib keeruliseks muuta refaktorimist ja rikkuda inkapsulatsiooni, võimaldades pärilikel klassidel või samas paketis olevatel klassidel otse manipuleerida objekti sisemise olekuga. Eelistada tuleks private koos avalike getter/setter meetoditega, kui otse pärimine ja sisemise teostuse juurdepääs ei ole peamine eesmärk.