Man merkt ja, das in den Java Librarys (also die schon vorhandenen) ziemlich oft mit .get...().get...() etc Variablen geholt werden bzw mit z.B. jtextfield.setText() etwas gesetzt.
Meine Frage ist nun, warum nutzt man anscheinend generell lieber die Getter-Setter anstatt die Variable einfach public zu setzen?
Ein Beispiel: Hier wird der Public-Variable einfach direkt ein Wert zugewiesen
Code:
public static class Location
{
public double Xachse;
public double Yachse;
}
public static void main(String[] args) {
Location location = new Location();
location.Xachse = 20.5;
location.Yachse = 10.1;
}
zweites Beispiel: Hier ist die Variable tatsächlich nicht direkt aufrufbar. Setter und Getter verwalten diese
Code:
public static class Location {
private double Xachse;
private double Yachse;
public double getX() {
return Xachse;
}
public void setX(double value) {
Xachse = value;
}
public double getY() {
return Yachse;
}
public void setY(double value) {
Yachse = value;
}
}
public static void main(String[] args) {
Location location = new Location();
location.setX(10);
location.setY(20.112);
}
Genauer: In welchen Fällen ist es Sinnvoll, Getter und Setter anstelle der Public-Variable zu verwenden?
Gibt es Vorteile/Nachteile? Wie sieht es mit der Performance aus? Ist die Getter/Setter Methode nicht Performance-lastig?
Vielleicht sogar irgendeine Sicherheitsmaßnahme?
Ich habe die Antwort bereits gefunden. Kann gerne gelöscht/geschlossen werden:
Es ist so, das zum überprüfen einer Variable z.B. Wert oder Eingabezulässigkeit, einfacher geprüft werden kann.
@Timori
Könntest du das vielleicht nochmal anders formulieren?
Mir ist nämlich noch nicht so ganz klar, was es bringt, eine private Variable voll zugänglich zu machen, anstatt sie einfach auf public zu setzen.
Nehmen wir an, du möchtest eine Library (nicht ausführbare .jar) erstellen und diese deinen Freunden oder Klassenkameraden etc. weiter geben.
Im 1. Beispiel: Nochmal zur Referenz:
Code:
public static class Location
{
public double Xachse;
public double Yachse;
}
public static void main(String[] args) {
Location location = new Location();
location.Xachse = 20.5;
location.Yachse = 10.1;
}
können die Leute in den Variablen einfach reinschreiben was sie wollen, unabhängig davon, ob es ein double-Wert ist oder nicht oder in der IDE hieße es: Die Eingabe muss vom Typ Double sein.
Du hast hier nur die Möglichkeit die Eingabe abzufangen, BEVOR sie gesetzt wird.
Im Vergleich dazu Beispiel 2:
Code:
public static class Location {
private double Xachse;
private double Yachse;
public double getX() {
return Xachse;
}
public void setX(double value) {
Xachse = value;
}
//... setY()... //
}
public static void main(String[] args) {
Location location = new Location();
location.setX(10);
location.setY(20.112);
}
Vor "Xachse = value;" hast du noch die Chance, innerhalb der setX() Methode weitere Abfragen zu machen.
Nehmen wir eine Bool-Variable hinzu, die erlaubt, ob der Wert gesetzt werden darf. Etwa:
Hier siehst du, das in der setX() Methode, abgefragt wird, ob die boolsche Variable "erlaubeSet" auf true gesetzt ist.
Dies ist z.B. dann sinnvoll, Wenn du eine GUI hast, in der der benutzer ALLE Felder ausfüllen muss, da es sonst zu falschen oder fehlerhaften Datensätzen (in einer Datenbank z.B.) kommen kann.
Oder, wenn du diese .jar deinen Freunden geben willst, das sie keine Fehlerabfragen machen müssen, weil du sie schon in der Klasse abgefangen hast.
Du könntest ja auch so etwas tun:
Code:
public static class Location {
private double Xachse;
private double Yachse;
public double getX() {
return Xachse;
}
public void setX(double value) {
Xachse = value;
}
public void setX(String value)
{
double val = Double.parseDouble(value);
setX(val);
}
}
public static void main(String[] args) {
Location location = new Location();
location.setX(10);
location.setX("10.012");
}
hier wird noch eine setX(String value) Methode erzeugt. Nun kann der Nutzer auch Strings einlesen.
Auf den Punkt: public: die Variable sowie Typ ist fest definiert.
double dblVariable = "AAA" -> Fehler! "AAA" ist String und nicht Double! Du müsstest vorher als Nutzer der .Jar die Abfrage selbst machen. get-set: Du hast die Möglichkeit, genauere Abfragen zu machen, um Fehler oder Programmfunktionalität nicht zu gefährden.
Der Nutzer kann diese Variable nun aufrufen (get), oder über eine von dir kontrollierte Methode, setzen.
Planst du, dein Programm in Zukunft unter die Leute zu bringen oder eine selbst erstellte Klasse, solltest du darauf achten, das so wenig public-Variablen wie möglich zugänglich sind(oder am besten keine).
Ich hoffe diese Erklärung hilft dir. Ich habe sie selber hier im Forum gefunden und nun so wiedergegeben, wie ich es verstanden habe.
Vielleicht können noch ein paar Stellen verbessert werden, aber ich denke ich habe den Unterschied gut erfasst