warum Setter/Getter

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hey, ihc hab mal ne ganz dumme Frage,warum benutzt man überhaupt Getter/Setter -Methoden ,
bzw. gibts irgendeinen technischen Grund warum man nicht einfach per public auf die Varibalen zugreifen sollte?
 

thE_29

Top Contributor
Bei Punkt 2: Wenn ich also den Typ umändere brauche ich nur die getter/setter Methoden umbauen und dann gehts..
LOOL.. Und wenn der Typ anders ist, brauche natürlich net überall dort wo ich get/set habe die Typen ändern.. Nene..


Desweiteren finde ich es ja auch "blöd" das wenn man eine Klasse mit Objekten hat, zB sowas

Gegeben sei eine Klasse B!

Code:
public class A
{
private B node;
public void setB(B b)
{ this.node = b;
}

public B getB()
{
return this.node;
}

So, da in Java ja alles call by reference ist, ist für mich die setter Methode total umsonst!

Weil wenn ich sage getB() und dann diese Klasse B verändere, so wird ja das eigentliche B verändert (call by value).

Somit wäre die Methode setB(..) umsonst, da es ja schon gesetzt ist!
Auf das hat mich ein C++ Programmierer hingewiesen, der diese Problem in C++ damit umgeht, das er bei den get Methoden immer "Konstanten" zurückliefert. Also Objekte die nicht veränderbar sind!

Gibt es in Java sowas auch?! Weil das Wort const an sich gibt es ja, bzw der JBuilder machts blau :bae:
 

Marco13

Top Contributor
In Java gibt es NUR call by value. Da aber (abgesehen von denen mit primitiven Typen) alle Variablen Referenzen sind, "fühlt es sich manchmal an" wie call by reference.

Trotzdem werde ich weiterhin sowas sagen wie "es wird ein Objekt zurückgegeben", obwohl man eigentlich sagen müßte "es wird die Kopie einer Referenz auf ein Objekt zurückgeliefert". Dabei ist "Objekt" und "(Kopie einer) Referenz auf ein Objekt" der Einfachheit synonym verwendet.

Die Methode setB in deinem Beispiel dient nur dem Zweck, zu sagen, welches Objekt zurückgeliefert werden soll, wenn man getB aufruft. Und die Methoden sind NICHT sinnlos: Wenn du später zur Erkenntnis gelangst, dass IMMER, wenn ein neues 'b' gesetzt wird, eine bestimmte Aktion ausgeführt werden muß, musst du nur
Code:
    public void setB(B b)
    {
        this.b = b;
        eineBestimmteAktion();
    }
machen. Andernfalls müßtest du überall, wo (verstreut im ganzen Programm) die Zeile
Code:
einA.b = irgendeinB();
auftaucht, eine Änderung durchführen.
 

Marco13

Top Contributor
Nachtrag: Das Wort 'const' ist in Java reserviert (genau wie goto) wird aber nicht verwendet (genau wie goto). In manchen Fällen, erfüllt "final" eine ähnliche Bedeutung wie "const" in C++, aber es ist NICHT die gleiche! ("final" ist etwas "schwächer"). Wenn du willst, dass das Objekt, das mit get() zurückgegeben wird, nicht verändert werden darf, darfst du es nicht zurückgeben. Es gäbe da (je nach Zusammenhang) verschiedene "Workarounds" - z.B. get-Funktionen anzubieten, für das, was man sich eigentlich von dem Objekt holen würde, oder ein "immutability-Wrapper" wie z.B. bei Collections.unmodifiableCollection
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html#unmodifiableCollection(java.util.Collection)
 

thE_29

Top Contributor
Naja, bei Methoden bewirkt final das die Methoden nicht überschrieben werden können!

Und es ging mir ja nicht darum, das Objekt zu verändern, sondern eben das die set Methode eigentlich unnötig wäre, weil es ja call by value (tschuldige mein Fehler.. Verwechsel diese 2 immer - besser das mal gleich oben aus ;)) ist.


Und der C++ Programmierer hat mir genauso das Bsp was du oben gebracht hast, als Argument für get/set Methoden! Eben wenn man etwas ändern/loggen etc will wenn die Variable geändert wird, sind solche get/set Methoden sicher vorteilhafter ;)


Aber wie gesagt, der Punkt 2 in den FAQ ist einfach nur dämlich. Denn wenn ich den Typ ändert, muss ich den Typ bei den get/set Methoden auch ändern (also dort wo sie benutzt werden). Außer ich arbeite immer mit Object und mache ein if instanceof und caste es dann hin... (was aber kaum jemand tun wird).



Nachtrag 2: Warum heitß das eigentlich call by value?! Das ist doch totale Blödaussage..

Zitat call by value:

In diesem Beispiel ist zu sehen, dass die beiden Variablen a und b lediglich ihre Werte an die Funktion test übergeben, aber im Gegensatz zu einem Referenzparameter dabei unverändert bleiben.


Tjo, dh, bei call by value müsste es immer unverändert bleiben! Da man in Java aber net explizit sagen kann sei Referenz oder sei eine "Kopie" würde ich eher dazu tendieren das man sagt, es ist call by reference.


Aber dann findet man wieder sowas:

In der Sprache Java wird bei primitiven Datentypen automatisch ein Wertparameter (call by value) verwendet. Bei komplexen Datentypen wird kein richtiger Referenzparameter (aber sicher kein call by value - da dies dazu führen würde das es unverändert bleibt) verwendet. Es wird eine Kopie der Referenz übergeben, die aber auf das gleiche Objekt verweist. Somit hat eine Änderung im Objekt auch bei der aufrufenden Methode Auswirkungen.

Da verstehe ich net wirklich warum man eine Kopie von einem Objekt das eigentlich auf das gleiche zeigt (also gleichen Adressbaum - wo ist das dann eine Kopie?!) übergibt, anstatt gleich das gleiche Objekt :D
 

Marco13

Top Contributor
Der zweite Punkt ist nicht dämlich, du hast ihn nur falsch verstanden :bae: Es geht dabei darum, dass die zugrundeliegene Implementierung der Map sich ändert. Sinngemäß
Code:
public String getValue(String k)
{
    return hashMap.get(k);
}
Und dann entscheidet man sich, ... *bla, Beispiel aus der Luft greif* das mit Properties zu machen
Code:
public String getValue(String k)
{
    return RessourceBundle.blablup.getValue(k);
}
Du weißt sicher, was gemeint ist... :roll:

Und das final <-> const ... Wie gesagt: In manchen Fällen ist es ähnlich, z.B. bei der Parameterübergabe
Code:
// C++
void foo(const int i)
{
    i = 3; // Fehler!
}

// Java
void foo(final int i)
{
    i = 3; // Fehler!
}
aber bei Referenzen ist C++ da restriktiver. In C++ gibt's da ja auch noch mehr Möglichkeiten. Bin da etwas aus der Übung, aber soweit ich weiß sind da ja (wenn mans drauf anlegt) tatsächlich solche abstrusen Deklarationen wie
const int const * doSomething(const int const * arg) const { ... }
möglich.... Also eine Methode, die eine konstanten Zeiger auf einen Konstanten int bekommt, einen konstanten Zeiger auf einen konstanten int zurückliefert, und dabei das Objekt konstant läßt. (Vielleicht syntaktisch nicht ganz richtig, aber sowas ähnliches ist glaubich möglich)
 

thE_29

Top Contributor
Achso hat er das gemeint ;)

Tjo, dann habe ich das falsch verstanden :bae:

Habe vorher noch was dazugehängt, zum Thema call by value /call by reference!
 

Marco13

Top Contributor
Ja, habs gesehen, habe jetzt nur gewartet bis du den synchronized-Block verlassen und durch deinen Post den Lock wieder freigegeben hast :wink:

Frag den C++-Menschen, den du oben erwähnt hast, mal ein bißchen zu Pointern aus. Man könnte (zur Verdeutlichung(!)) sagen, dass man in Java NUR mit Pointern hantiert:
Code:
// Java
Object x = new Object(); 

// C++
Object *x = new Object();
Das *x ist dabei sozusagen eine "ganz normale Variable". Und diese Variable enthält als WERT (value) die Speicherstelle, an der das neue Objekt liegt. In Java "läßt man nur das Sternchen weg".

Wenn man diese Referenz (Java) bzw. Pointer (C++) dann an eine Funktion übergibt, wird die standardmäßig by value übergeben.
Code:
// Java:
Object x = new Object(); 
foo(x);

void foo(Object y)
{
    y ist hier eine Kopie der Referenz x (call by value)
}


// C++
Object *x = new Object();
foo(x);

void foo(Object *y)
{
    *y ist hier eine Variable, die die Speicherstelle enthält, die auch in *x steht (also die Stelle, wo das Objekt liegt)
    *y ist also eine Kopie von *x (call by value)
}

In C++ gibt's dann nochmmal eine andere Form von Referenzen
void foo(int& x)
aber ... ich belasse es erstmal dabei.
 

thE_29

Top Contributor
Ich kann selber auch C++ ;)

Nur bin ich selber zZ in Java eingetieft und ich kriege immer und immer mehr Probleme mit Java desto tiefer man reingeht (alleine schon das mit dem EventDispatchThread das nachzeichnen das hintereinanderabarbeiten von Events die eigentlich schon vorher gemacht worden sind oder während der EDT eine Komponente X zeichnet, möchte ich gerne Lade.. hinschreiben, nur da das auch vom EDT gemacht wird, sehe ich in 5/10 Fällen nix...)


Und dein unten angeschnittenes Bsp mit dem int darf man nicht heranziehen, da das in C++ ja auch ein primitiver Datentyp ist ;)

Da du ja auch int * p = 1; gar nicht sagen kannst.. (dann würde er dir auf die Adresse 1 zeigen)

Hingegen int i = 1; und dann int *p = &i; würde gehen!


Code:
class B
{
public:
	int a;
	B(){
		a = 12;
	}
};

void test(B* b)
{
	b->a = 23;
}


int main(int argc,char *argv[])
{
	B *testB = new B();
	printf("\nVorher %d",testB->a);
	test(testB);
	printf("\nNachher: %d", testB->a);
}

Ausgabe wäre: Vorher 12
Nachher: 23
 

Leroy42

Top Contributor
Jango hat gesagt.:
Code:
~B(){}
ist für mich dasselbe wie ein leerer Konstruktor in Java
Code:
class Jango extends HobbitImBlutrausch {
  public Jango() {
  }
  ...
}

Dient also nur dazu beim Ansehen im Editor dem Monitor
ein paar schwarze Pixel mehr zu gönnen um ihn zu schonen. :bae:
 

André Uhres

Top Contributor
get- und set-Methoden sind besonders nützlich für die Introspection und Customization von Beans
bei der Anwendungsentwicklung mit Application Buildern. So lässt z.B. ein Methodenpaar
Code:
public String getName()
public void setName(String n)
auf eine Property name vom Typ String schließen.
Bei Properties des Datentyps boolean ist auch die is-Methode für den lesenden Zugriff möglich.
Wird als Datentyp ein Array gefunden und gibt es für diese Property noch zusätzliche set- und get-Methoden
mit einem Index vom Typ int als Parameter, so wird daraus auf eine Indexed Property geschlossen.
 

The_S

Top Contributor
Joa, das hier z. B.

Code:
public String korrigiereTextNachDeutscherRechtschreibung(String text) {
   // sehr viel wirres Zeug
   return korrigierterText;
}

(es wurde bewusst public ausgewählt *duck* *wegrenn*)
 

The_S

Top Contributor
lol ... wenn die andern jetzt wüssten, was wir wissen, dann würden sie die aussage jetzt evtl. auch verstehen ...

aber aufgrund der tatsache, dass sie nicht wissen, was wir wissen, glauben sie jetzt bestimmt was falsches zu wissen

weißt du?
 

André Uhres

Top Contributor
Ich hätte dazu noch einen nützlichen Getter:
Code:
public String getWasDieAnderenNichtWissen(){...}
:lol:
 

The_S

Top Contributor
:lol:

Code:
public String getWasDieAnderenNichtWissen(NichtWisser user){
   if (!user.equals(jango) && !user.equals(hobbit)) {
      return null;
   }
   else {
      return topSecret;
   }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Getter/Setter - wie sieht ein Setter aus? Und wie nicht? Java Basics - Anfänger-Themen 34
W Getter/Setter Java Basics - Anfänger-Themen 4
KogoroMori21 Objektvariable anderer Klasse übernehmen, Getter/Setter Java Basics - Anfänger-Themen 11
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
KogoroMori21 Getter und Setter Java Basics - Anfänger-Themen 5
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
V getter/setter Garage Java Basics - Anfänger-Themen 12
S getter, setter in abstrakter Klasse oder lieber Unterklassen Java Basics - Anfänger-Themen 4
topi Kapselung getter und setter Java Basics - Anfänger-Themen 5
D Setter/Getter für Instanzvariablen praktisch? Java Basics - Anfänger-Themen 19
S Getter/Setter - Variablenklasse ? Java Basics - Anfänger-Themen 5
S getter and setter Java Basics - Anfänger-Themen 12
L Getter und Setter Java Basics - Anfänger-Themen 2
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
E Methoden Objekte in Methode aufrufen ohne getter und setter? Java Basics - Anfänger-Themen 1
L Klassen - Getter & Setter Methoden Java Basics - Anfänger-Themen 2
D Erste Schritte Java - Setter und Getter Java Basics - Anfänger-Themen 1
Z Getter/Setter NullPointer Exception Java Basics - Anfänger-Themen 6
K Klassen Setter/Getter Java Basics - Anfänger-Themen 3
F OOP Schleifen und Probleme mit Setter und Getter Java Basics - Anfänger-Themen 1
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
K Kapselung getter & setter Java Basics - Anfänger-Themen 11
J Frage zu Setter u. Getter Java Basics - Anfänger-Themen 7
T Variablen Getter-Setter vs Public Variable? Java Basics - Anfänger-Themen 5
Y Konstruktor - Setter/Getter Java Basics - Anfänger-Themen 3
N Klassen fragen zur getter und setter methode Java Basics - Anfänger-Themen 11
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
K getter & setter Java Basics - Anfänger-Themen 6
C getter/setter Problem anscheinend Java Basics - Anfänger-Themen 13
G Erste Schritte Getter und Setter Java Basics - Anfänger-Themen 12
B Getter,Setter - Konstruktor überflüssig? Java Basics - Anfänger-Themen 26
N Sprite Methode (Getter, Setter, Konstruktor) Java Basics - Anfänger-Themen 9
S getter/setter aufrufen Java Basics - Anfänger-Themen 9
B Java getter/setter funktioniert nicht! Java Basics - Anfänger-Themen 7
X OOP Getter/Setter überschreiben den Wert ihrer Variablen nicht Java Basics - Anfänger-Themen 4
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
V public Variablen vs Getter + Setter Java Basics - Anfänger-Themen 4
F Getter und Setter Java Basics - Anfänger-Themen 4
lulas[]args getter/setter umstellung Java Basics - Anfänger-Themen 6
B Klassen Getter-Setter vor neuem Klassenaufruf - wie? Java Basics - Anfänger-Themen 20
N OOP Getter, Setter und andere Probleme Java Basics - Anfänger-Themen 8
A OOP Getter und Setter Java Basics - Anfänger-Themen 18
L Unterschied Konstruktor / Getter Setter Java Basics - Anfänger-Themen 13
L Setter und Getter für Arrays? Java Basics - Anfänger-Themen 4
N boolean bei Setter und getter methoden Java Basics - Anfänger-Themen 21
J Getter und Setter auch intern benutzen - guter Stil? Java Basics - Anfänger-Themen 31
Houly Setter/Getter MEthoden testen Java Basics - Anfänger-Themen 4
P OOP Getter&Setter Methoden funktionieren nicht Java Basics - Anfänger-Themen 7
H Setter-und-Getter-Konvention Java Basics - Anfänger-Themen 8
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
-horn- EINE setter/getter klasse aus mehreren klassen befüllen Java Basics - Anfänger-Themen 13
C Getter/Setter Java Basics - Anfänger-Themen 61
H Frage zu getter und setter Java Basics - Anfänger-Themen 5
S Unbenutzte/überflüssige Getter/Setter herausfinden? Java Basics - Anfänger-Themen 2
M getter/setter bei JTextField ? Java Basics - Anfänger-Themen 21
S In einer Liste auf getter und setter zugreifen Java Basics - Anfänger-Themen 6
I If / Else in Setter? Java Basics - Anfänger-Themen 8
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
C Setter-Methode mit final-Attribut Java Basics - Anfänger-Themen 9
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
JavaTalksToMe Kapselung Setter Frage Java Basics - Anfänger-Themen 15
kilopack15 Ist diese setter-Methode richtig? Java Basics - Anfänger-Themen 2
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
F Setter Java Basics - Anfänger-Themen 4
gamebreiti Problem mit Setter in Superklasse Verkettung der Kostruktoren??? Java Basics - Anfänger-Themen 7
N Setter funktioniert nicht Java Basics - Anfänger-Themen 6
M Methoden Problem bei Setter. Java Basics - Anfänger-Themen 2
S setter Java Basics - Anfänger-Themen 9
S Ein Attribut/Instanz eines bestehendes Objektes mit SETTER Methode ändern Java Basics - Anfänger-Themen 3
S Setter Methode von Boolean Java Basics - Anfänger-Themen 11
propra Gegenteil von Setter-Methoden Java Basics - Anfänger-Themen 30
T Setter Methode Wertebereich eingrenzen Java Basics - Anfänger-Themen 5
F Setter-Methode bei double-Array Java Basics - Anfänger-Themen 6
A Setter verschachteln? Java Basics - Anfänger-Themen 4
D Kapselung override Setter Java Basics - Anfänger-Themen 5
T Variablen fast identische Setter Java Basics - Anfänger-Themen 14
H OOP Setter im Konstruktor um code nicht zu wiederholen? Java Basics - Anfänger-Themen 2
N immer Setter-Methoden verwenden? Java Basics - Anfänger-Themen 54
U Problem mit setter Java Basics - Anfänger-Themen 17
S Setter bei Variablen Java Basics - Anfänger-Themen 6
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44
G [Hibernate] Could not find a setter for property Java Basics - Anfänger-Themen 2
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
O Instanzattribut per Getter Methode zuweisbar, warum? Java Basics - Anfänger-Themen 8
P Klassenübergreifende Ausgabe mittels "getter" nicht möglich Java Basics - Anfänger-Themen 21
J Array über Getter erlangen Java Basics - Anfänger-Themen 34
M Getter einer PriorityQueue Java Basics - Anfänger-Themen 1
KopaCoda Getter mehrfach aufrufen -> ist das guter code? Java Basics - Anfänger-Themen 3
V Getter Methode Java Basics - Anfänger-Themen 38
T Extrahiertes Objekt durch Getter bekommen Java Basics - Anfänger-Themen 2
D Kapselung final Variablen mit Getter? Java Basics - Anfänger-Themen 2
A getter Java Basics - Anfänger-Themen 3
T Getter für Array Java Basics - Anfänger-Themen 4
J-Gallus Ein Getter bekommt eine anderen Type als er Return soll Java Basics - Anfänger-Themen 9
K Public Attribute oder getter - funktioniert leider beides hier nicht Java Basics - Anfänger-Themen 5
P getter Java Basics - Anfänger-Themen 1
M Getter Problematik mit ItemListener Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben