Achtergrond van de vraag
In Java zijn toegangsmutatortypes geïmplementeerd met het doel gegevens te encapsuleren en het principe van het verbergen van interne details van een klasse te realiseren. Sinds de komst van Java is private een synoniem geworden voor het beschermen van gegevens tegen onbedoelde of ongeautoriseerde toegang van buiten de klasse.
Probleem
Zonder juiste toegang tot velden en methoden kan de interne staat van objecten van buitenaf worden gewijzigd door klassale of externe code. Dit leidt tot schending van de encapsulatie, debugproblemen en frequente bugs.
Oplossing
private garandeert dat een veld, methode of interne klasse alleen toegankelijk is binnen de klasse waarin deze zijn gedeclareerd. Voor toegang tot privévelen en -methoden worden meestal getters en setters (toegangs-methoden) gebruikt. Dit ondersteunt encapsulatie en controle over de wijzigingen in de staat van het object.
Codevoorbeeld:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Belangrijke kenmerken:
Kan een genestelde klasse toegang krijgen tot de private leden van de buitenste klasse?
Ja, een genestelde (inner) klasse heeft volledige toegang tot de privévelden en -methoden van zijn buitenste klasse, omdat het deel uitmaakt van de implementatie ervan.
Codevoorbeeld:
public class Outer { private int data = 42; class Inner { int getData() { return data; // toegankelijk! } } }
Kan een constructeur private zijn en waarom zou dat nodig zijn?
Ja, dat kan. Een privéconstructor wordt gebruikt in singleton-patronen of om de creatie van een object alleen binnen de klasse te beperken, bijvoorbeeld via een fabrieksmethode.
Wat gebeurt er als een veld private static wordt gedeclareerd?
Velden private static zijn alleen toegankelijk binnen hun eigen klasse, maar behoren tot de klasse in plaats van een instantie. Dit is handig voor het opslaan van hulpcounters, constanten en andere statische gegevens die niet van buitenaf toegankelijk zijn.
In het project waren alle velden van de User-klasse gedeclareerd als public. Dit stelde externe modules in staat om velden zoals balance en password direct te wijzigen.
Voordelen:
Nadelen:
In hetzelfde project waren de velden van de klasse private gemaakt en werkte men met gevalideerde setters. Fouten bij het werken met balans en wachtwoorden waren onmiddellijk zichtbaar.
Voordelen:
Nadelen: