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"

27voto

Jorge Aguilar Punkte 3412

Nun, ich möchte nur hinzufügen, dass, auch wenn sie manchmal für die Kapselung und Sicherheit Ihrer Variablen/Objekte notwendig sind, wenn wir ein echtes objektorientiertes Programm programmieren wollen, dann müssen wir KEINE ÜBERMÄSSIGE NUTZUNG DER ACCESSOREN Denn manchmal sind wir sehr von ihnen abhängig, wenn es nicht wirklich notwendig ist, und das ist fast dasselbe, als wenn wir die Variablen öffentlich machen.

24voto

kangalioo Punkte 583

Ich weiß, es ist ein bisschen spät, aber ich denke, es gibt einige Leute, die sich für die Leistung interessieren.

Ich habe einen kleinen Leistungstest durchgeführt. Ich habe eine Klasse "NumberHolder" geschrieben, die, nun ja, einen Integer enthält. Sie können diesen Integer entweder mit der Getter-Methode lesen anInstance.getNumber() oder durch direkten Zugriff auf die Nummer mit anInstance.number . Mein Programm liest die Zahl 1.000.000.000 Mal, auf beiden Wegen. Dieser Vorgang wird fünfmal wiederholt und die Zeit wird ausgedruckt. Ich habe das folgende Ergebnis erhalten:

Time 1: 953ms, Time 2: 741ms
Time 1: 655ms, Time 2: 743ms
Time 1: 656ms, Time 2: 634ms
Time 1: 637ms, Time 2: 629ms
Time 1: 633ms, Time 2: 625ms

(Zeit 1 ist der direkte Weg, Zeit 2 ist der Getter)

Der Getter ist nämlich (fast) immer ein bisschen schneller. Dann habe ich es mit einer anderen Anzahl von Zyklen versucht. Anstelle von 1 Million habe ich 10 Millionen und 0,1 Millionen verwendet. Die Ergebnisse:

10 Millionen Zyklen:

Time 1: 6382ms, Time 2: 6351ms
Time 1: 6363ms, Time 2: 6351ms
Time 1: 6350ms, Time 2: 6363ms
Time 1: 6353ms, Time 2: 6357ms
Time 1: 6348ms, Time 2: 6354ms

Bei 10 Millionen Zyklen sind die Zeiten fast identisch. Hier sind 100 Tausend (0,1 Millionen) Zyklen:

Time 1: 77ms, Time 2: 73ms
Time 1: 94ms, Time 2: 65ms
Time 1: 67ms, Time 2: 63ms
Time 1: 65ms, Time 2: 65ms
Time 1: 66ms, Time 2: 63ms

Auch bei unterschiedlicher Anzahl von Zyklen ist der Getter etwas schneller als der normale Weg. Ich hoffe, das hat Ihnen geholfen.

5 Stimmen

Es gibt einen "spürbaren" Overhead, wenn man einen Funktionsaufruf hat, um auf den Speicher zuzugreifen, anstatt einfach die Adresse eines Objekts zu laden und einen Offset hinzuzufügen, um auf die Mitglieder zuzugreifen. Wahrscheinlich hat die VM Ihren Getter ohnehin optimiert. Unabhängig davon ist der erwähnte Overhead es nicht wert, alle Vorteile von Gettern/Settern zu verlieren.

21voto

Mohamed Punkte 169

Verwenden Sie keine Getter/Setter, es sei denn, sie werden für die aktuelle Lieferung benötigt, d.h. denken Sie nicht zu viel darüber nach, was in der Zukunft passieren würde, wenn irgendetwas geändert werden soll, ist dies in den meisten Produktionsanwendungen und -systemen ein Änderungsantrag.

Denken Sie einfach, leicht, fügen Sie bei Bedarf Komplexität hinzu.

Ich würde die Unwissenheit von Geschäftsinhabern über tiefes technisches Know-how nicht ausnutzen, nur weil ich es für richtig halte oder mir der Ansatz gefällt.

Ich habe massive System ohne Getter Setter nur mit Zugriffsmodifikatoren und einige Methoden zu validieren n durchführen biz Logik geschrieben. Wenn Sie unbedingt benötigt die. Verwenden Sie alles.

20voto

Ich habe eine ganze Weile darüber nachgedacht, und ich glaube, die wahren Gründe sind:

  1. Code für die Schnittstelle, nicht für die Implementierung
  2. Schnittstellen spezifizieren nur Methoden, keine Felder

Mit anderen Worten, die einzige Möglichkeit, ein Feld in einer Schnittstelle zu spezifizieren, besteht darin, eine Methode zum Schreiben eines neuen Wertes und eine Methode zum Lesen des aktuellen Wertes bereitzustellen.

Diese Methoden sind die berüchtigten Getter und Setter....

2 Stimmen

Okay, zweite Frage: Wenn es sich um ein Projekt handelt, bei dem Sie den Quellcode an niemanden exportieren und die volle Kontrolle über den Quellcode haben... gewinnen Sie dann etwas mit Gettern und Settern?

3 Stimmen

In jedem nicht-trivialen Java-Projekt müssen Sie für Schnittstellen programmieren, um die Dinge überschaubar und testbar zu machen (denken Sie an Mockups und Proxy-Objekte). Wenn Sie Schnittstellen verwenden, brauchen Sie Getter und Setter.

19voto

Devrath Punkte 39521

Wir verwenden Getter und Setter:

  • für Wiederverwendbarkeit
  • die Validierung in späteren Phasen der Programmierung durchzuführen

Getter- und Setter-Methoden sind öffentliche Schnittstellen für den Zugriff auf private Klassenmitglieder.


Mantra der Verkapselung

Das Mantra der Kapselung ist, Felder privat und Methoden öffentlich zu machen.

Getter-Methoden: Wir können Zugriff auf private Variablen erhalten.

Setter-Methoden: Wir können private Felder ändern.

Auch wenn die Getter- und Setter-Methoden keine neue Funktionalität hinzufügen, können wir unsere Meinung ändern und später zurückkommen, um die Methode

  • besser;
  • sicherer; und
  • schneller.

Überall, wo ein Wert verwendet werden kann, kann eine Methode hinzugefügt werden, die diesen Wert zurückgibt. Anstelle von:

int x = 1000 - 500

verwenden.

int x = 1000 - class_name.getValue();

Für den Laien ausgedrückt

Representation of "Person" class

Angenommen, wir müssen die Details dieser Person . Diese Person hat die Felder name , age y sex . Dies beinhaltet die Erstellung von Methoden für name , age y sex . Wenn wir nun eine weitere Person erstellen müssen, ist es notwendig, die Methoden für name , age , sex immer wieder von neuem.

Anstatt dies zu tun, können wir eine Bean class(Person) mit Getter- und Setter-Methoden. Morgen können wir also einfach Objekte dieser Bean erstellen class(Person class) wenn wir eine neue Person hinzufügen müssen (siehe Abbildung). Auf diese Weise werden die Felder und Methoden der Bean-Klasse wiederverwendet, was viel besser ist.

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