Author Topic: Getter/ Setter?  (Read 6512 times)

Eikel

  • Newbie
  • *
  • Posts: 24
  • Karma: +0/-0
    • View Profile
    • http://
Getter/ Setter?
« on: June 17, 2007, 07:21:46 pm »
Tach schön,

habe da ein Problem im UML Diagramm, betreffend der Operationen im Klassendiagramm.
Wenn ich ein XYZ-Attribut (private) mit einer GetXYZ-Operation auslesen möchte um dieses dann anschließend in einer anderen Klasse zu verwenden, benutze ich dann wieder die GetXYZ-Operation oder die SetXYZ-Operation?
Hin und her und pi pa po - das verwirrt mich ganz schön hier...  :wacko:

starKI

  • Full Member
  • ***
  • Posts: 239
  • Karma: +0/-0
    • View Profile
Getter/ Setter?
« Reply #1 on: June 17, 2007, 09:14:05 pm »
Kommt drauf an, aus welcher Methode die Aktion gestartet wird. Ist es ein Objekt der Klasse, die XYZ enthält, dann musst du einen Setter der anderen Klasse benutzen. Holt sich jedoch ein Objekt dieser Klasse das Attribut von der Klasse, die es urpsrünglich hat, so musst du deren Getter benutzen.
Aber ne kleine Warnung noch: Wenn das Attribut ein Referenztyp ist und du irgendwas daran in der einen Klasse änderst, wird es auch in der anderen geändert. Wenn das nicht gewünscht ist, musst du clonen (und da Java standardmäßig nur flach clont ist das ein bissel Aufwand).

Eikel

  • Newbie
  • *
  • Posts: 24
  • Karma: +0/-0
    • View Profile
    • http://
Getter/ Setter?
« Reply #2 on: June 17, 2007, 09:51:18 pm »
Hey,
also zwischen zwei Klassen Setter benutzen, innerhalb der eigenen Klasse Getter benutzen? Habsch das so einigermaßen richtig verstanden?

Hinsichtlich des Referenztyps noch ne kleine Frage: Wenn ich beispielsweise den Wert des Attributes XYZ nur einmal benötige (z.B. für eine Berechnung von UVW), dann sollte ich clonen? Wenn ich jedoch immer den aktuellen Wert von XYZ benötige, ist Get/Set die Operation meiner Wahl?

Und im allgemeinen - clonen - wie geht das? Ne eigene Methode schreiben oder gibts da schon was nettes Java-intern?

So viele Fragen....  :huh:

starKI

  • Full Member
  • ***
  • Posts: 239
  • Karma: +0/-0
    • View Profile
Getter/ Setter?
« Reply #3 on: June 17, 2007, 11:14:42 pm »
Ne, hast mich nicht richtig verstanden.
Zum Verständnis: Getter und Setter werden benutzt, damit ein anderes Objekt oder was auch immer die (privaten) Attribute einer Klasse lesen (Getter) oder ggf. auch schreiben (Setter) kann.
Hast du in einem Objekt der Klasse A ein Attribut XYZ, was ein Objekt der Klasse B gerne wissen möchte, dann muss B die entsprechende Getter-Methode von A aufrufen und bekommt dann das Attribut übergeben. Ist jedoch A mitteilungsbedürftig und möchte irgendein Attribut von B ändern, so ruft Klasse A die entsprechende Setter-Methode der Klasse B auf. Das ganze ist nur dadurch bedingt, dass man die meisten Attribute einer Klasse "private" setzt. Der Schreibzugriff darauf erfolgt mittels Setter, der Lesezugriff mittels Getter. Auf diese Weise kann man die Lese- und Schreibzugriffe innerhalb der entsprechenden Getter- und Setter-Methoden "kontrollieren" (ob nicht vlt. jemand was Böses damit anstellen will). Man könnte auch alle Attribute public machen und sich Setter und Getter sparen ... aber das wäre nicht im Sinne der OOP und du würdest sicher bei der Bewertung ein paar aufs Dach kriegen.
 
Zu der Referenztypgeschichte und zum Clonen:
Wenn ein Objekt unserer Klasse B sich über einen Getter (der Klasse A) ein Attribut von A holt und dieses Attribut dann abändert, diese Änderung aber nicht gleichzeitig in A stattfinden soll, musst du clonen. Willst du den Objekt-Inhalt "global" ändern, darf nicht geclont werden (andernfalls wird es sehr umständlich). Diese ganze Sache ist für Sicherheitsaspekte sehr wichtig. Stell dir vor, jemand gibt dir (in Bezug auf unsere Praktikumsaufgaben) über eine Schnittstelle eine Bestellung (aber nur die Referenz)und du legst das ganze in irgendner Datenstruktur ab. Danach macht derjenige, der bestellt hat irgendwas mit seinem Bestellung-Objekt (ändert irgendwas). Dann ist das bei dir im System auch geändert (was wahrscheinlich nicht gewünscht ist). Bei unserem Praktikum wird lt. Dr. Kuhmichel auf diese Sicherheitsaspekte kein allzugroßer Wert gelegt aber normalerweise müsstest du auch hier clonen.
In Java gibt es standardmäßig in allen von "Object" abgeleiteten Klassen (-> quasi in allen Klassen) die Methode clone(). Um die benutzen zu können, musst du aber in diesen Klassen die Schnittstelle Cloneable implementieren (im Quelltext: "public class A implements Cloneable"). Das Problem ist aber, dass Java standardmäßig nur "flach" kopiert. D.h. wenn du z.B. eine ArrayList hast, die selber Objekte enthält, dann bekommst du mit clone() zwar eine neue ArrayList (=eine neue Referenz auf eine ArrayList), aber die Referenzen innerhalb der ArrayList zeigen immernoch auf die gleichen Objekte wie vorher. In den allermeisten Fällen hat man damit nichts gekonnt. Deshalb muss man in seiner Klasse die Methode clone() überschreiben und sich ne eigene Methode basteln, die eine "tiefe" Kopie macht. Das ganze wird rein praktisch dann rekursiv gemacht. D.h. wenn du Objekte clonen willst, die selber wieder Objekte enthalten: Du rufst die Methode clone() des obersten Objektes auf, die ruft dann die Clone-Methoden aller ihrer Unterobjekte auf, usw.
Ist jetzt sicher ersmal bissel harter Tobak ... also versuch erstmal das mit den Klassen richtig zu raffen und dann lies dir den Text nochmal durch ;) .
Kannst ja auch mal googeln (genügend Stichworte hab ich dir ja jetzt geliefert).

Eikel

  • Newbie
  • *
  • Posts: 24
  • Karma: +0/-0
    • View Profile
    • http://
Getter/ Setter?
« Reply #4 on: June 17, 2007, 11:45:25 pm »
Okay,
das mit Getter/ Setter habsch verstanden, denke ich ;)

Das mit dem clonen macht mir jetzt auch Sinn, weiß allerdings nicht, ob und wie ich das mit meinen Kollegen dann da rein friemeln werde...

Auf jeden fall ein großes Dankeschön an dieser Stelle!