In Java worden toegang tot velden, methoden en klassen beheerd met behulp van toegangsmodifiers: private, default (package-private), protected, public.
Geschiedenis van de vraag:
Vroegere versies van Java hadden strikte object-encapsulatie. Voor flexibiliteit werden verschillende toegangslevels geïntroduceerd ter ondersteuning van zowel volledige afsluiting als uitbreidbaarheid (overerving en toegang binnen pakketten).
Probleem:
Een verkeerde keuze van modifier kan leiden tot schending van encapsulatie, problemen met overerving, onmogelijkheid tot testen, of zelfs security bugs als gegevens per ongeluk openbaar worden.
Oplossing:
Gebruik de meest afgesloten modifier die uw architectuur toelaat. Velden worden meestal private gemaakt, met toegang via getter/setter. Methoden worden public gemaakt alleen als ze deel uitmaken van de API, en voor uitbreiding — protected.
Codevoorbeeld:
public class Person { private String name; // afgesloten veld protected int age; // toegankelijk binnen het pakket en afgeleiden String email; // package-private public String getName() { return name; } }
Belangrijke kenmerken:
private — alleen toegankelijk binnen de klasseprotected — plus toegang voor afgeleiden, zelfs vanuit andere pakkettenpublic — toegankelijk voor iedereenKan een toegangsmodifier worden toegepast op lokale variabelen?
Nee. Toegangsmodifiers worden alleen toegepast op klassen, methoden en velden/intern klassen, maar niet op lokale variabelen.
Kan een klasse binnen een methode worden gemaakt met de modifier public?
Nee. Een lokale klasse kan niet met een toegangsmodifier worden gedeclareerd, hij heeft altijd zichtbaarheid binnen de methode.
Is een protected-lid toegankelijk voor een afgeleide klasse in een ander pakket?
Ja, protected-leden zijn toegankelijk voor afgeleiden, zelfs als ze in andere pakketten zijn, maar niet voor gewone klassen in een ander pakket.
Alle velden van de klasse zijn per ongeluk public gedeclareerd — ze worden rechtstreeks benaderd vanuit andere klassen, waardoor het moeilijk is om de plaats van veranderingen te volgen.
Voordelen:
Nadelen:
Alle velden zijn private, en publieke methoden controleren de toegang met validatie, alleen noodzakelijke delen worden protected gemaakt voor uitbreiding in afgeleiden.
Voordelen:
Nadelen: