De toegangsmethode protected staat leden van de klasse toe zichtbaar te zijn binnen hetzelfde pakket en in alle subklassen, zelfs als ze zich in andere pakketten bevinden.
Verschillen met andere toegangsmethoden:
private — toegang alleen binnen de huidige klasseprotected — toegankelijk binnen het huidige pakket en in afgeleiden klassen buiten het pakketpublic — overal toegankelijkVoorbeeld:
package com.example.base; public class Parent { protected void sayHello() { System.out.println("Hallo van ouder"); } } package com.example.child; import com.example.base.Parent; public class Child extends Parent { public void tryHello() { sayHello(); // Toegang is er! } } public class NotChild { public void fail(Parent p) { // p.sayHello(); // Fout: geen toegang } }
Kan een externe klasse (geen afgeleide) toegang krijgen tot een
protected-methode uit een ander pakket, mits ze een object van die klasse heeft?
Antwoord: Nee, toegang tot een protected-methode uit een ander pakket is alleen toegestaan voor afgeleide klassen, en alleen via this of via een verwijzing naar het afgeleide object, niet naar de ouder.
Parent p = new Child(); p.sayHello(); // Fout! ((Child) p).sayHello(); // Succes (indien aangeroepen binnen Child)
Verhaal
In een groot modulair project plaatste een ontwikkelaar belangrijke bedrijfsfuncties in de
protected-sectie, in de veronderstelling dat ze niet toegankelijk waren buiten het pakket. Andere ontwikkelaars gebruikten deze methoden per ongeluk in tests binnen hetzelfde pakket, en door het verplaatsen van klassen ontstonden onverwachte toegangsproblemen.
Verhaal
In een microservices-project probeerden ze een methode met protected-toegang aan te roepen via een verwijzing naar het ouder type in een ander pakket — de aanroep werkte niet. Dit veroorzaakte een storing in delen van de uitbreidingsmechanismen van het systeem, omdat men vertrouwde op een onjuiste interpretatie van de zichtbaarheid.
Verhaal
In een open-source bibliotheek werden protected-velden ongepast gebruikt, die toegankelijk bleken voor een te breed scala aan klassen, waardoor per ongeluk de interne toestand van een object beschadigd werd, wat problemen veroorzaakte in externe applicaties.