Kleines Nachschlagewerk Informatik
Datenkapselung
Worum geht es?
Daten (also Attribute) sollte man im Objekt verstecken, also private oder protected setzen. Für den Zugriff bietet man ein Interface (einen Methodensatz) an, mit dem diese Attribute verändert werden dürfen.
Warum Datenkapselung?
Es kann im Rahmen der Weiterentwicklung einer Klasse jederzeit passieren, dass man die Art, Daten zu speichern, ändern möchte. Man kann Namen und Typen ändern, aber richtig große Änderungen vornehmen. Erlaubte man anderen Programmierern bisher, auf diese Attribute zuzugriefen, müssen diese nach Änderungen auch ihren Quelltext ändern. Zwei Beispiele sollen den Sinn verdeutlichen.

Eine Spielfigur in einem 2D-Spiel braucht eine x- und eine y-Position. Diese sind Integer, weil es keine halben Pixel gibt. Nun lassen sich damit keine weichen Bewegungen programmieren. Um dies zu ermöglichen, kann man die Positionen als double halten und erst zum Zeitpunkt des Zeichnens auf Integer casten. Programmierer, die bisher Positionen direkt abgefragt haben, bekommen nun Schwierigkeiten und müssen ebenfalls casten. Hat man SetX- bzw. GetX-Methoden, können diese gern auf Integer bleiben. Andere Programmierer würden von den internen Änderungen nichts merken.

In einem 3D-Spiel wurden die Ausrichtung als Quaternion und die Position als Vektor gespeichert. Nun möchte man alles in eine 4D-Matrix packen, um die Koordinatentransformation zu vereinfachen. Die Änderungen an anderen Stellen des Quelltextes wären nicht zu überschauen.
Ausnahmen
Sind manche Klassen sehr klein und einfach, kann man Attribute öffentlich machen. Ein gern verwendetes Beispiel ist der dreidimensionale Vektor. X, y und z sollte man direkt setzen können, sonst wird der Quelltext zu schwer lesbar.

      class Vektor {
          public double x = 0.0;
          public double y = 0.0;
          public double z = 0.0;
          public double laenge()
          {
              return Math.sqrt(x*x + y+y + z*z);
          }
      }
      ...
      Vektor stuetzVektor = new Vektor();
      stuetzVektor.x = 30.0;