Java Language
Getter und Setter
Suche…
Einführung
Getter und Setter hinzufügen
Die Kapselung ist ein grundlegendes Konzept in OOP. Es geht darum, Daten und Code als einzelne Einheit zu verpacken. In diesem Fall empfiehlt es sich, die Variablen als private
zu deklarieren und dann über Getters
und Setters
darauf zuzugreifen, um sie anzuzeigen und / oder zu ändern.
public class Sample {
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Auf diese privaten Variablen kann nicht direkt von außerhalb der Klasse zugegriffen werden. Sie sind somit vor unbefugtem Zugriff geschützt. Wenn Sie sie jedoch anzeigen oder ändern möchten, können Sie Getter und Setter verwenden.
getXxx()
-Methode gibt den aktuellen Wert der Variablen xxx
, während Sie den Wert der Variablen xxx
mit setXxx()
.
Die Namenskonvention der Methoden lautet (in Beispielvariable heißt variableName
):
Alle nicht
boolean
VariablengetVariableName() //Getter, The variable name should start with uppercase setVariableName(..) //Setter, The variable name should start with uppercase
boolean
VariablenisVariableName() //Getter, The variable name should start with uppercase setVariableName(...) //Setter, The variable name should start with uppercase
Öffentliche Getter und Setter sind Teil der Property- Definition eines Java-Beans.
Verwenden eines Setter oder Getter zum Implementieren einer Einschränkung
Setter und Getter ermöglichen, dass ein Objekt private Variablen enthält, auf die mit Einschränkungen zugegriffen und diese geändert werden können. Zum Beispiel,
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
if(name!=null && name.length()>2)
this.name = name;
}
}
In dieser Person
Klasse gibt es eine einzige Variable: name
. Auf diese Variable kann mit der Methode getName()
zugegriffen und mit der Methode setName(String)
geändert werden. setName(String)
jedoch einen Namen setName(String)
, muss der neue Name setName(String)
als 2 Zeichen sein und darf nicht null sein. Eine Setter - Methode anstatt macht die variablen name
Öffentlichkeit andere ermöglicht , den Wert zu setzen name
mit gewissen Einschränkungen. Dasselbe kann auf die Getter-Methode angewendet werden:
public String getName(){
if(name.length()>16)
return "Name is too large!";
else
return name;
}
In der modifizierten getName()
-Methode oben wird der name
nur zurückgegeben, wenn seine Länge kleiner oder gleich 16 ist. Andernfalls wird "Name is too large"
zurückgegeben. Dies ermöglicht dem Programmierer das Erstellen von Variablen, die beliebig erreichbar und modifizierbar sind, und verhindert, dass Client-Klassen die Variablen ungewollt bearbeiten.
Warum verwenden Sie Getter und Setter?
Betrachten Sie eine Basisklasse, die ein Objekt mit Gettern und Setters in Java enthält:
public class CountHolder {
private int count = 0;
public int getCount() { return count; }
public void setCount(int c) { count = c; }
}
Wir können nicht auf die count
Variable zugreifen, weil sie privat ist. Wir können jedoch auf die getCount()
und setCount(int)
, da sie öffentlich sind. Für einige könnte dies die Frage aufwerfen; warum den Mittelsmann vorstellen? Warum machen Sie sie nicht einfach öffentlich?
public class CountHolder {
public int count = 0;
}
In jeder Hinsicht sind diese beiden Funktionen in Bezug auf die Funktionalität identisch. Der Unterschied zwischen ihnen ist die Erweiterbarkeit. Überlegen Sie, was jede Klasse sagt:
- Erstens : "Ich habe eine Methode, die Ihnen einen
int
Wert gibt, und eine Methode, die diesen Wert auf einen anderenint
". - Zweitens : "Ich habe ein
int
, das Sie einstellen und erhalten können, wie Sie möchten."
Diese klingen vielleicht ähnlich, aber die erste ist in ihrer Natur viel mehr bewacht. Es lässt Sie nur mit seiner inneren Natur interagieren, während es diktiert. Der Ball bleibt auf seinem Platz. Es entscheidet, wie die internen Interaktionen stattfinden. Die zweite hat seine interne Implementierung von außen ausgesetzt ist , und ist nun nicht nur anfällig für externe Benutzer, aber im Fall einer API, die mich zu , dass die Umsetzung aufrechterhalten (oder auf andere Weise ein nicht-rückwärtskompatible API Freigabe).
Überlegen wir, ob wir den Zugriff synchronisieren möchten, um die Zählung zu ändern und darauf zuzugreifen. Im ersten ist das einfach:
public class CountHolder {
private int count = 0;
public synchronized int getCount() { return count; }
public synchronized void setCount(int c) { count = c; }
}
aber im zweiten Beispiel, das ist jetzt fast unmöglich , ohne durch zu gehen und Modifizieren jeden Ort , an dem die count
referenziert wird. Schlimmer noch, wenn dies ein Element, das Sie in einer Bibliothek sind die Bereitstellung von anderen verbraucht werden, müssen Sie nicht auf eine Art und Weise , dass die Modifikation der Durchführung, und die harte Wahl oben erwähnt machen gezwungen.
So stellt sich die Frage; sind öffentliche Variablen immer eine gute Sache (oder zumindest nicht böse)?
Ich bin mir nicht sicher Auf der einen Seite sehen Sie Beispiele für öffentliche Variablen, die sich bewährt haben (IE: die out
Variable, auf die in System.out
verwiesen wird). Andererseits bietet die Bereitstellung einer öffentlichen Variablen keinen Vorteil außerhalb eines extrem geringen Overheads und einer möglichen Verringerung der Wortlautstärke. Meine Leitlinie hier wäre, wenn Sie vorhaben, eine Variable öffentlich zu machen, sollten Sie sie anhand dieser Kriterien mit extremen Vorurteilen beurteilen:
- Die Variable sollte keinen Grund haben, ihre Implementierung jemals zu ändern. Dies ist etwas, das extrem einfach zu vermasseln ist (und selbst wenn Sie es richtig machen, können sich die Anforderungen ändern). Wenn Sie über eine öffentliche Variable verfügen, muss dies wirklich durchdacht werden, insbesondere wenn sie in einer Library / Framework / API veröffentlicht wird.
- Die Variable muss so häufig referenziert werden, dass die minimalen Gewinne durch die Reduzierung der Ausführlichkeit dies rechtfertigen. Ich denke nicht, dass der Aufwand für die Verwendung einer Methode im Vergleich zur direkten Referenzierung hier berücksichtigt werden sollte. Es ist viel zu vernachlässigbar für das, was ich zu 99,9% der Bewerbungen schätzen würde.
Wahrscheinlich gibt es mehr, als ich mir überlegt habe. Wenn Sie jemals Zweifel haben, verwenden Sie immer Getter / Setter.