Sobes.tech
Junior

Wat is een 'protected' toegangsmodifier in een programmeertaal en wanneer moet het worden gebruikt?

sobes.tech AI

Antwoord van AI

protected — is een toegangsmodifier die ervoor zorgt dat leden van een klasse (velden, methoden) binnen de klasse zelf, in afgeleide klassen (zelfs als ze zich in een andere package bevinden) en in alle klassen van dezelfde package toegankelijk zijn.

Toepassing:

Wordt gebruikt wanneer je toegang wilt geven tot de leden van de klasse alleen aan haar erfgenamen en andere klassen in dezelfde package, en ze te verbergen voor de buitenwereld buiten dit package en de erfhiërarchie.

Voorbeelden van gebruiksscenario's:

  • Wanneer de basisklasse velden of methoden bevat die deel uitmaken van de interne implementatie, maar nodig zijn om functionaliteit uit te breiden in afgeleide klassen.

    public class Animal {
        protected String name; // Toegankelijk voor erfgenamen en klassen in hetzelfde package
    
        protected void eat() { // Toegankelijk voor erfgenamen en klassen in hetzelfde package
            System.out.println(name + " is aan het eten.");
        }
    }
    
    public class Dog extends Animal {
        public void bark() {
            System.out.println(name + " blaft."); // Toegang tot het protected veld name
            eat(); // Toegang tot de protected methode eat()
        }
    }
    
  • Wanneer er in een package een groep classes is die nauw met elkaar verbonden zijn, en ze toegang moeten hebben tot elkaars interne elementen, maar deze elementen willen verbergen voor classes uit andere packages. In dit geval werkt protected vergelijkbaar met de standaard (package-private) modifier voor classes in hetzelfde package, maar opent ook toegang voor erfgenamen uit elke package.

    // Package com.example.core
    package com.example.core;
    
    public class BaseConfig {
        protected int threshold = 10; // Toegankelijk voor classes in com.example.core en erfgenamen uit elk package
    }
    
    // Package com.example.app (kan in een ander package zijn)
    package com.example.app;
    
    import com.example.core.BaseConfig;
    
    public class AppConfig extends BaseConfig {
        public void displayThreshold() {
            System.out.println("Drempelwaarde: " + threshold); // Toegang tot protected veld uit een ander package
        }
    }
    
    // Package com.example.core
    package com.example.core;
    
    public class RelatedConfig {
         public void printBaseThreshold(BaseConfig config) {
             System.out.println("Base drempelwaarde vanuit RelatedConfig: " + config.threshold); // Toegang tot protected veld in hetzelfde package
         }
    }
    

Vermijd overmatig gebruik van protected, omdat dit refactoring kan bemoeilijken en encapsulatie kan schenden, door erfgenamen of classes in hetzelfde package direct toegang te geven tot de interne toestand van het object. Het is beter om private te gebruiken met publieke getter/setter-methoden, als directe erfelijkheid en toegang tot de interne implementatie niet het hoofddoel zijn.