Private Members auf Objektebene

aquasonic

Erfahrenes Mitglied
Hallo zusammen,

ich habe in meinem Studim letztens einen Test geschrieben, bei welchem mir eine Aufgabe nicht klar war. Es ging darum zwei Klassen zu machen (Punkt und Dreieck). Ein Dreieck besteht aus drei Punkten und man soll die die Fläche des Dreiecks berechnen. Weitere Anforderung war dass alle Members "private" sein sollen und keine "Getter"-Methoden geschrieben werden dürfen.

Für mich war dies nicht wirklich lösbar, da ich keine Chance sah auf die X- und Y-Koordinaten der Punkte zuzugreifen, um die Fläche zu berechnen.

Als ich beim Dozenten nachfragte, gab er mir folgende Antwort:

In Java schützt das Attribut "private" den Zugriff auf Members (=Variablen, Methoden, Inner Classes, ...) von ausserhalb der Klasse, in der dieses Attribut deklariert ist. Sie können also nicht von einem Objekt der Klasse Triangle auf private Members eines Objektes der Klasse Point zugreifen. Hingegen haben Sie in der Klasse Point sehr wohl Zugriff auf private Members dieser Klasse von einem anderen Point Objekt aus. Ein Schutz der Members auf Objektebene gibt es (mind. in Java) nicht.

Ich wollte nun einmal fragen ob dies wirklich so ist? Kann man auf die privaten Member so zugreifen und gibt es wirklich keine Möglichkeit diese auf Objektebene zu schützen?

Danke für die Informationen.

Gruss
aquasonic
 

Oliver Gierke

Erfahrenes Mitglied
Ich vermute Sinn der Aufgabe war eine Methode getArea() auf Triangle zu implementieren, die die drei Punkte nutzt um eben die Fläche zu berechnen.

Ich finde diese Aufgabe für eine Aufgabe aus dem Studium sehr spannend, da sie dich darüber nachdenken lassen soll, WO Funktionalität implementiert wird. Natülich kannst mit get-Methoden die Punkte des Dreiecks erfragen und deine Clientklasse (die, die das Triangle benutzt) die berechnung ausführen lassen. Allerdings ist doch genau diese Berechnung Teil des Dreiecks, die in der Klasse Triangle implementiert werden sollte.

Was er mit "Schutz des Members auf Objektebene" meint, ist vermutlich folgendes: private und protected usw. definieren die Sichtbarkeit der Variablen aus dem Objekt bzw. Package hinaus. Es gibt nun in Java keine Schlüsselwörter, mit denen man die Sichtbarkeit der Variablen innerhalb des Objektes z.B. auf bestimmte Methoden einschränken kann, lediglich die Unterscheidung zwischen Klassen- bzw. Instanzvariablen und lokalen Variablen in Methoden.

REINHAUN!
 

aquasonic

Erfahrenes Mitglied
Somit würde also folgender Lösungsansatz funktionieren:

Java:
public class Point {

  private int x, y;
  .....
  public double distance(Point p) {
    return Math.sqrt((p.x-x)*(p.x-x) + (p.y-y)*(p.y-y));
  }
.....
}

public class Triangle {

  .......
  public double getArea() {
    double a = p1.distance(p2);
    double b = p2.distance(p3);
    double c = p1.distance(p3);
    double s = (a + b + c) / 2.;
    return Math.sqrt(s * (s - a) * (s - b) * (s - c));
  }
  .......
}

Besonders die Frage, ob die Zeile

Java:
return Math.sqrt((p.x-x)*(p.x-x) + (p.y-y)*(p.y-y));

funktioniert, wo auf p.x zugegriffen wird?
 
Zuletzt bearbeitet von einem Moderator:

Oliver Gierke

Erfahrenes Mitglied
Exakt ;), Obwohl ich auf Point die Getter für die Koordinaten nicht unbedingt für versteckenswert halte. Aber grundsätzlich sieht das sehr gut aus.

REINHAUN!