1878 Stimmen

Warum Getter und Setter/Accessors verwenden?

Was ist der Vorteil der Verwendung von Gettern und Settern - die nur abfragen und setzen - anstatt einfach öffentliche Felder für diese Variablen zu verwenden?

Wenn Getter und Setter jemals mehr tun als nur das einfache Get/Set, kann ich dies sehr schnell herausfinden, aber ich bin nicht 100% klar, wie:

public String foo;

schlechter ist als:

private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }

Ersteres hingegen erfordert viel weniger Standardcode.

8 Stimmen

10 Stimmen

Natürlich ist beides gleich schlecht, wenn das Objekt keine zu ändernde Eigenschaft benötigt. Ich würde lieber alles privat machen, und dann Getter hinzufügen, wenn es nützlich ist, und Setter, wenn es nötig ist.

31 Stimmen

Google "accessors are evil"

2voto

Antz Punkte 281

In einer objektorientierten Sprache deklarieren die Methoden und ihre Zugriffsmodifikatoren die Schnittstelle für dieses Objekt. Zwischen dem Konstruktor und den Accessor- und Mutator-Methoden kann der Entwickler den Zugriff auf den internen Zustand eines Objekts kontrollieren. Wenn die Variablen einfach als öffentlich deklariert werden, gibt es keine Möglichkeit, den Zugriff zu regeln. Und wenn wir Setter verwenden, können wir den Benutzer auf die von uns benötigten Eingaben beschränken. Das bedeutet, dass die Eingabe für genau diese Variable über einen geeigneten Kanal erfolgt, der von uns vordefiniert ist. Es ist also sicherer, Setzer zu verwenden.

2voto

Lakindu Hewawasam Punkte 543

Meiner Erfahrung nach ist es ideal, Variablen als privat zu kennzeichnen und für jede Variable Accessoren und Modifikatoren bereitzustellen.

Auf diese Weise können Sie je nach Bedarf reine Lese- oder Schreibvariablen erstellen.

Die nachstehende Implementierung zeigt eine schreibgeschützte Variable.

private String foo;
public void setFoo(String foo) { this.foo = foo; }
private String getFoo() { return foo; }

Unten sehen Sie eine schreibgeschützte Variable.

private String foo;
private void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }

2voto

Blasanka Punkte 17872

Getter und Setter, die von Datenverstecken . Data Hiding bedeutet Wir sind Daten vor Außenstehenden verstecken oder eine außenstehende Person/Ding kann nicht zugreifen Dies ist eine nützliche Funktion in OOP.

Ein Beispiel:

Wenn Sie eine öffentliche Variable erstellen, können Sie auf diese Variable zugreifen und den Wert überall (in jeder Klasse) ändern. Wenn Sie jedoch eine private Variable erstellen, kann diese Variable in keiner Klasse außer der deklarierten Klasse angezeigt/zugelassen werden.

public y private sind Zugangsmodifikatoren.

Wie können wir also von außen auf diese Variable zugreifen?

Dies ist der Ort Getter y Einsteller kommen. Sie können eine Variable als privat deklarieren und dann Getter und Setter für diese Variable implementieren.

Beispiel (Java):

private String name;

public String getName(){
   return this.name;
}

public void setName(String name){
   this.name= name;
}

Vorteil:

Wenn jemand auf folgende Werte zugreifen oder sie ändern/einstellen möchte balance variabel ist, muss er/sie die Erlaubnis haben.

//assume we have person1 object
//to give permission to check balance
person1.getName()

//to give permission to set balance
person1.setName()

Sie können den Wert auch im Konstruktor festlegen, aber wenn Sie später, wenn Sie Wert aktualisieren/ändern wollen, müssen Sie die Setter-Methode implementieren.

0 Stimmen

Ihre getBalance/setBalance sind nicht Getter/Setter, wenn sie anderen Code haben, sind sie? Und warum sollte man die Balance offenlegen? Wäre es nicht sicherer, ein applyPayment oder applyDebt zu haben, das die Überprüfung des Saldos erlaubt und vielleicht ein Memo-Feld, um zu sagen, woher die Zahlung kam? Hey! Ich habe gerade dein Design verbessert UND die Setter und Getter entfernt. Das ist die Sache mit den Settern/Gettern, es verbessert so gut wie immer den Code, wenn man sie entfernt, nicht dass sie "falsch" wären, nur dass sie fast immer zu schlechterem Code führen. Eigenschaften (wie in C#) haben übrigens genau das gleiche Problem.

1 Stimmen

Wir sind der Develloper, ein Mangel an Setter/Getter schützt nichts, wir können sie einfach hinzufügen....

1voto

MongooseLover Punkte 85

Mir fällt ein Grund ein, warum Sie nicht einfach alles öffentlich machen wollen.

So könnte beispielsweise auf eine Variable, die Sie nie außerhalb der Klasse verwenden wollten, zugegriffen werden, und sei es auch nur indirekt über einen Kettenvariablenzugriff (d. h. object.item.origin.x ).

Indem Sie fast alles privat halten und nur die Dinge, die Sie erweitern wollen und auf die Sie möglicherweise in Unterklassen verweisen, als geschützt einstufen und im Allgemeinen nur statische, endgültige Objekte als öffentlich haben, können Sie kontrollieren, was andere Programmierer und Programme in der API verwenden können und worauf sie zugreifen können und worauf nicht, indem Sie Setter und Getter verwenden, um auf die Dinge zuzugreifen, die Sie möchten, dass das Programm oder möglicherweise auch andere Programmierer, die zufällig Ihren Code verwenden, in Ihrem Programm ändern können.

0 Stimmen

Ein deutliches Beispiel hierfür ist, wenn das Setzen eines Attributwertes einen oder mehrere andere Attributwerte beeinflusst. Triviales Beispiel: Angenommen, Sie speichern den Radius eines Kreises. Die Verwendung von circ.set_radius()` bringt nicht wirklich etwas, wenn Sie den Radius direkt über circ.radius nicht. Allerdings können get_diameter(), get_circumference() und get_area() Berechnungen auf der Grundlage des Radius durchführen. Ohne Getter müssen Sie die Berechnungen selbst durchführen und überprüfen, ob Sie sie richtig durchgeführt haben.

1voto

fastcodejava Punkte 37539

Ich möchte nur die Idee der Annotation einbringen: @getter und @setter. Mit @getter sollte es möglich sein, obj = class.field, aber nicht class.field = obj. Bei @setter ist es umgekehrt. Mit @getter und @setter sollte man beides machen können. Dies würde die Kapselung bewahren und die Zeit reduzieren, da keine trivialen Methoden zur Laufzeit aufgerufen werden.

1 Stimmen

Es würde zur Laufzeit mit "trivialen Methoden" implementiert werden. Eigentlich wahrscheinlich nicht trivial.

0 Stimmen

Heute kann dies mit einem Anmerkungspräprozessor geschehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X