Home > Informatik > Begriffe und Konzepte > Datenkapsel

Datenkapsel

Definition

Datenkapselung

Die Daten eines Objekts sind gekapselt: Sie sind von außen nicht direkt sichtbar oder zugänglich. Änderungen an ihnen sind nur über manipulierende Methoden des Objektes möglich.

Erläuterungen

In Java wird Datenkapselung typischerweise durch die Verwendung des Zugriffsmodifizierers private für Datenfelder umgesetzt. Der Zugriff erfolgt dann ausschließlich über öffentliche Methoden.

public class Circle
{
    private int xPosition, yPosition, radius;

    public Circle()
    {
    }
    
    private boolean check(int value, int min, int max)
    {
       return ((value >= min) && (value <= max));
    }
    

    public void setPosition(int pX, int pY)
    {
        if (check(pX,0,500)) xPosition = pX;
        if (check(pY,0,400)) yPosition = pY;
    }

    public void setRadius(int pR)
    {
        if (check(pR,1,50))radius = pR; 
    }

    public int getXPosition()
    {
        return xPosition; 
    }

    public int getYPosition()
    {
        return yPosition; 
    }

    public int getRadius()
    {
        return radius; 
    }
    
    public double getPerimeter()
    {
       return 2 * 3.14 * radius;
    }
    
    public double getArea()
    {
       return 3.14 * radius * radius;
    }
}

Die Datenfelder xPosition, yPosition und radius sind gekapselt. Ein direkter Zugriff von außerhalb eines Circle-Objektes auf diese Felder ist nicht möglich. Diese drei Datenfelder können nur durch den Konstruktor oder durch die Setter-Methoden setPosition() und setRadius() verändert und nur durch die Getter-Methoden ausgelesen werden. Die Werte dieser Datenfelder können nur über manipulierende Methoden des Objekts verändert werden – ein direkter Zugriff ist ausgeschlossen.

Vorteil der Datenkapselung

Der Hauptvorteil der Datenkapselung in der objektorientierten Programmierung ist, dass sie die interne Implementierung eines Objekts verbirgt und schützt und nur eine kontrollierte Schnittstelle für den Zugriff auf seine Daten und Funktionen bereitstellt. Man sagt auch: Andere Objekte können Botschaften an die Datenkapsel schicken und sich dann darauf verlassen, dass die Datenkapsel diese Botschaften korrekt interpretiert. In Java erfolgt das Senden solcher Botschaften über den Aufruf von öffentlichen Setter- und Getter-Methoden der Datenkapsel.

Die wichtigsten Vorteile, die sich daraus ergeben sind:

1. Datensicherheit und -integrität

Die Datenfelder mit den Daten können nicht direkt von außen manipuliert werden. Zugriffe erfolgen nur über manipulierende und sondierende Methoden (Setter und Getter), die Überprüfungen durchführen und so die Konsistenz der Daten gewährleisten können.

In dem obigen Beispiel-Quelltext überprüft beispielsweise die Methode check(int value, int min, int max) ob der übergebene Wert value im Intervall liegt, das durch min und max begrenzt wird. So kann die xPosition keinen Wert größer als 500 annehmen.

Die Setter-Methoden setPosition() und setRadius() benutzen check(), um eine solche Überprüfung durchzuführen.

2. Geringere Komplexität

Entwickler, die ein Objekt verwenden, müssen sich nicht um dessen interne Details kümmern. Sie interagieren nur mit der öffentlichen Schnittstelle, was die Komplexität des Codes reduziert und die Verständlichkeit erhöht.

Um den Umfang eines Kreises zu ermitteln, wird einfach die Methode getPerimeter() aufgerufen. Wie die Methode intern arbeitet, ist völlig egal, solange die Berechnung korrekt ist. Theoretisch hätte man den Umfang auch in einem Datenfeld speichern können; hier wird er aber aus dem Radius des Kreises berechnet.

3. Leichtere Wartbarkeit und Flexibilität

Wenn sich die interne Implementierung eines Objekts ändert, müssen andere Teile des Codes, die dieses Objekt verwenden, nicht angepasst werden – solange die öffentliche Schnittstelle gleich bleibt. Dies erleichtert die Wartung und ermöglicht flexible Änderungen.

Falls sich bei der häufigen Verwendung von Circle-Objekten herausstellt, dass Umfang und Fläche nicht genau genug berechnet werden, dann passt man die beiden sondierenden Methoden so an, dass der Wert von Pi mit 6 oder 10 Nachkommastellen angegeben wird, was die Genauigkeit erhöht. Auf die Objekte oder Methoden, die getPerimeter() oder getArea() aufrufen, hat dies überhaupt keine Auswirkungen.

4. Bessere Wiederverwendbarkeit

Die Datenkapselung fördert die Entwicklung von eigenständigen, unabhängigen Objekten, die leichter in verschiedenen Teilen einer Anwendung oder sogar in anderen Projekten wiederverwendet werden können.

Da die Circle-Objekte keine Methoden zum Zeichnen oder Ausgeben zur Verfügung stellen, sind sie universell einsetzbar, sowohl in textorientierten Anwendungen wie auch in graphisch orientierten. In einer Graphik-Anwendung würde man dann eine Tochterklasse bzw. Unterklasse von Circle anlegen, die über entsprechende Methoden zum Zeichnen verfügt.

Quellen:

  1. Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
  2. Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
  3. Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.
  4. Balzert: Objektorientiert Programmieren, 4. Auflage, Springer-Verlag Berlin 2025.