Java getter und setter?
Was bringen getter und setter methoden? werden diese nur für klassenvariablen angewendet? Instanzvariablen kann man doch direkt beim erstellen des Objektes festlegen, wofür also Getter und Setter Methoden?
6 Antworten
Eine setter-Methode macht Sinn, wenn man beim Setzen oder Lesen einer Variable noch mehr tun, als sie nur zu setzen oder zu lesen möchte. D.h. im Getter/Setter steht mehr als nur eine Zeile. So kann man z.B. überprüfen, ob der Wert, auf den die Variable gesetzt werden soll, korrekt ist. Außerdem kann man auch Umrechnungen durchführen, falls man intern in anderen Einheiten rechnet, aber nach außen hin auch andere zulassen möchte. Es können ebenfalls Methoden zur Aktualisierung aufgerufen werden (dies wird oft beim Zeichnen angewandt, wenn man die Zeichenfläche aktualisieren will, nachdem man neue Zeichenelemente hinzugefügt hat).
Eine setter-Methode macht Sinn, wenn man eine Variable nur lesbar, aber nicht schreibbar machen möchte oder wenn man bereits auf einen Setter setzt.
In anderen Fällen, auf die obiges nicht zutrifft, sollte besser direkt auf die Variablen zugegriffen werden.
Also wenn Instanzvariablen private sind. Kann man diese ja nicht mehr via. "Instanz.variable" erreichen sonder nur noch über "getX()" und "setX()"
Und warum macht man sie dann nicht public? Das macht doch überhaupt keinen Sinn.
Aber wofür das ganze eigentlich? Warum sollte man eine Instanz Variable nicht einfach so ansprechen können, bzw. warum nur über get und set?
Eben. Die obige Begründung macht keinen Sinn. Es liegt nicht an der Datenkapselung (liegt es schon, aber nicht so, wie du es oben definiert hast), sondern vielmehr an den Gründen, die Willibergi und ich zusammengestellt haben.
Schau dir hier auch mindestens die ersten drei Antworten an: https://stackoverflow.com/questions/1568091/why-use-getters-and-setters
wenn du eine Klasse "Haus" haet mit den PRIVATEN variablen zB länge, höhe, breite, farbe. Dann kannst du dirch den konstruktor diese so gleich mitübergeben: Haus h = new Haus(lä, hö, br, far);
dann kannst du sie durch getter&setter neu setzten oder zurückgeliefert bekommen.
Guten Tag,
getter und setter sin für Angaben da, also z.B.: Du erstellst einen JFrame und sagst frame.setBounds(xx, xx); dann legst du die Größe fest, also kannst du mit Settern (wie du siehst auch bei Instanzen) bestimmte Sachen festlegen.
Mit gettern bekommst du etwas ausgegeben, ein konkretes Beispiel habe ich jetzt nicht aber sagen wir du möchtest eine in die Konsole eingegebene zahl haben und sagst dann getInt("name");. Ich weiß das Beispiel ist nicht korrekt aber es erklärt ganz gut wofür ein getter ist (du kannst Daten speichern bzw. bekommen).
Jetzt zu deiner zweiten Frage: Ja das kannst du, aber wenn ich deine Frage richtig verstanden habe, dann würden die Angaben beim erstellen jedes neuen Objektes immer gleich bleben, wenn du das nicht möchtest machst du das besser für jeder Objekt neu.
hoffe ich konnte helfen :-)
getter und setter sind gut falls ein Objekt mehr als nur ein atribut hat. Zum Beispiel erstellst du eine Klasse Mensch und dieser Mensch hat ein Alter, Name, Größe. und mit den gettern bekommst du sie und mit den settern definierst du sie
Nee, ich habs jetzt schon selber verstanden. Das macht man anscheinend wegen der Datenkapsellung, da jede Instanzvariable private sein sollte, kann man die nur noch über get() und set() ansprechen.
Ich zitiere hier jetzt einfach mal Christian Ullenboom in seinem Buch "Java ist auch eine Insel":
Attribute sind eine tolle und notwendige Sache. Allerdings ist zu überlegen, ob der Nutzer eines Objekts immer direkt auf die Attribute zugreifen sollte oder ob dies problematisch ist:
- Bei manchen Variablen gibt es Wertebereiche, die einzuhalten sind. Das Alter eines Spielers kann nicht kleiner null sein, und Menschen, die älter als zweihundert Jahre sind, werden nur in der Bibel genannt. Wenn wir das Alter privat machen, kann eine Zugriffsmethode wie setAge(int) mithilfe einer Bereichsprüfung nur bestimmte Werte in die Objektvariable übertragen und den Rest ablehnen. Die öffentliche Methode getAge() gibt dann Zugriff auf die Variable.
- Mit einigen Variablen sind Abhängigkeiten verbunden. Wenn zum Beispiel ein Spieler ein Alter hat, kann der Spieler gleichzeitig eine Wahrheitsvariable für die Volljährigkeit deklarieren. Natürlich gibt es nun eine Abhängigkeit. Ist der Spieler älter als 18, soll die Wahrheitsvariable auf true stehen. Diese Abhängigkeit lässt sich mit zwei öffentlichen Variablen nicht wirklich erzwingen. Eine Methode setAge(int) kann jedoch bei privaten Attributen diese Konsistenz einhalten.
- Gibt es Zugriffsmethoden, so lassen sich dort leicht Debug-Breakpoints setzen. Auch lassen sich die Methoden so erweitern, dass der Zugriff geloggt (protokolliert) wird oder die Rechte des Aufrufers geprüft werden.
- Bei Klassen gilt das Geheimnisprinzip. Obwohl es vorrangig für Methoden gilt, sollte es auch für Variablen gelten. Möchten Entwickler etwa ihr internes Attribut von intauf BigInteger ändern und damit beliebig große Ganzzahlen verwalten, hätten wir ein beträchtliches Problem, da an jeder Stelle des Vorkommens ein Objekt eingesetzt werden müsste. Wollten wir zwei Variablen einführen – ein int, damit die alte, derzeit benutzte Software ohne Änderung auskommt, und ein neuesBigInteger – hätten wir ein Konsistenzproblem.
- Nicht immer müssen dem Aufrufer haarklein alle Eigenschaften angeboten werden. Der Nutzer möchte sogenannte höherwertige Dienste vom Objekt angeboten bekommen, sodass der Zugriff auf die unteren Attribute vielleicht gar nicht nötig ist.
Quelle: Christian Ullenboom (2016). Java ist auch eine Insel. Bonn: Rheinwerk Computing (S. 410).
LG
Ich habe gelesen, dass man das wegen der Datenkapselung macht. Also wenn Instanzvariablen private sind. Kann man diese ja nicht mehr via. "Instanz.variable" erreichen sonder nur noch über "getX()" und "setX()"
Aber wofür das ganze eigentlich? Warum sollte man eine Instanz Variable nicht einfach so ansprechen können, bzw. warum nur über get und set?