Design-Frage

Status
Nicht offen für weitere Antworten.

Reality

Top Contributor
Hallo,
wenn ich den Code schon so schreibe,

Code:
private int x;

public void setX(int x){
this.x = x;
}

dann kann ich es auch so schreiben:
Code:
public int x;

Code:
class OtherClass{
public static void main(String args[]){
  Bla bla = new Bla();
  bla.x = 5;
}

Oder was macht der obere Code für einen Sinn, der übrigens langsamer ist?

Liebe Grüße
Reality
 
das keine andere "böse" Klasse mittels Reflection ohne das du es mitbekommst den Inhalt ändern kann!

Außerdem sollte man halt it getter/setter Methoden arbeiten, da ja sonst public/protected/private ja sowieso unsinnig wäre. (wäre ja am besten wenn alles public wäre)

In C# sind die getter/setter Methoden perfektioniert worden 😉 Da sagt man get set und dann welche var und der kümert sich um alles :bae:


Aber das hat einfach was mit OO Programmieren zu tun, das man Objekte außerhalb der eigenen Klassen einfach keinen Zugriff geben will/soll!

Da ist C++ wiederum super, da man dort Friend sagen kann und sich so die getter/setter Methoden sparen kann, da man explizit sagen kann, du bist mein Freund und dann darf er zugreifen... 🙂
 
Informiere Dich mal zum Thema Datenkapselung:

http://de.wikipedia.org/wiki/Kapselung_(objektorientierte_Programmierung)
 
thE_29 hat gesagt.:
das keine andere "böse" Klasse mittels Reflection ohne das du es mitbekommst den Inhalt ändern kann!
???:L Per Reflection kann ich aber auch die Methode aufrufen, die mein x manipuliert, also wo ist der Unterschied?!

Außerdem sollte man halt it getter/setter Methoden arbeiten, da ja sonst public/protected/private ja sowieso unsinnig wäre. (wäre ja am besten wenn alles public wäre)
Nö, wenn ich z.B. mit Variablen nur innerhalb der Klasse arbeite, dann sollten sie private sein.

Liebe Grüße
Reality
 
hier gibt es ja keinen unterschied? von aussen kann man bei beiden versionen den wert verändern, bei der ersten direkt, bei der zweiten über die setter methode.

macht doch bloss sin wenn man mehrere eigenschaften setzen kann, aber nur möchte, dass die eine gesetzt werden darf?

oder bin ich auf dem falschen dampfer?
 
naja, da hast recht, ich könnts so halt auch ändern (also mit den Methoden 😉)

ich meinte man sollte mit diesen Methoden arbeiten wenn du außerhalb brauchst!

innerhalb brauchste nie solche Methoden, das ist klar 😉
 
thE_29 hat gesagt.:
ich meinte man sollte mit diesen Methoden arbeiten wenn du außerhalb brauchst!
Wieso soll ich das x von außen nicht direkt setzen?
Ich denke, das hat in diesem Fall eher etwas mit Ästetik zu tun.

Liebe Grüße
Reality
 
Man weiss nie, ob man eine Klasse nicht spaeter einmal veraendern moechte, (Entschuldigt meine Schreibweise, amerikanische Tastatur...).

Wenn man nun Getter und Setter verwenden, wird man keine Probleme kriegen, man kann die Variable sogar loeschen.
Arbeitet man mit public, ... viel Spass dann beim Suchen all der Fehler, und beim korrigieren.

Dieses Argument ist fuer solch kleine Klassen nicht so wahnsinnig ueberzeugend. Andererseits bringt es Vorteile, wenn alle Klassen in solchen Dingen gleich funktionieren (es sei denn, ihr schaut gerne fuer jede Zeile Code nach, ob man jetzt einen Getter oder eine public Variable verwenden muss).

Und: Getter und Setter koennen von Subklassen ueberschrieben werden (Besonders interessant, wenn bei einem Set ploetzlich noch mehr geschehen soll), bei einer public Variable geht das nicht.

Und: Man kann den Namen der public Variable in keiner Subklasse verwenden, die Gefahr aus versehen die falsche Variable zu benuzten waere zu gross. Das ist aber ziemlich unpraktisch, denn wer erfindet schon gerne andauernd neue Namen?
 
Noch ein Argument:

Du kannst in der set-Methode den Wert der übergeben wird sofort prüfen, damit im späteren Verlauf des Programms keine Fehler entstehen. Also z.B. eine Division durch Null:

Code:
private int zahl;

public setZahl(int zahl) {
    if (zahl != 0) this.zahl = zahl;
}

private void rechne() {
    ergebnis = wert / zahl;
}

Würdest du die Variable nun direkt setzen (also Bla.zahl = 0), dann kommt es zu einem Fehler.
Natürlich könnte man jetzt sagen, dass man das auch in der Methode rechne() überprüfen könnte. 😛
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben