Warum sind Getter- und Setter-Methode in Java wichtig?

Mir wurde beigebracht, immer Getter und Setter zu benutzen. Ich kenne jedoch die Vor- und Nachteile dieser Methoden nicht, da wir sie durch die Implementierung der Daten offenlegen und auch verstecken.

Ich bin ein wenig verwirrt darüber. Kann jemand einen guten Rat geben, warum wir einen Getter / Setter benutzen und welche Vorteile es hat?

   

Das grundlegende Feld “Privates Feld mit öffentlichem Getter und Setter, das nur das Feld zurückgibt oder setzt” ist in der Tat völlig sinnlos, wenn es um die Kapselung geht, außer dass Sie es später ändern können, ohne die API zu ändern.

Also benutze dieses Muster nicht unbedacht. Überlegen Sie genau, welche Operationen Sie tatsächlich benötigen.

Der wahre Sinn von Getter und Setter ist, dass Sie sie nur dort verwenden sollten, wo sie angemessen sind und dass sie mehr können, als nur Felder zu bekommen und zu setzen.

  • Sie können nur einen Getter haben. Dann ist die Eigenschaft schreibgeschützt. Dies sollte eigentlich der häufigste Fall sein.
  • Sie können nur einen Setter haben, der die Eigenschaft konfigurierbar macht, aber mitteilen, dass nichts anderes von ihrem Wert abhängen sollte
  • Ein Getter kann einen Wert aus mehreren Feldern berechnen, anstatt ein Feld zurückzugeben.
  • Ein Getter kann eine defensive Kopie erstellen
  • Ein Getter kann eine teure Abrufoperation träge ausführen und ein Feld zum Zwischenspeichern des Werts verwenden
  • Ein Setter kann IllegalArgumentException durchführen und IllegalArgumentException
  • Ein Setter kann Listener über Änderungen des Werts informieren
  • Sie können einen Setter haben, der mehrere Felder zusammenfasst, weil sie konzeptionell zusammengehören. Dies entspricht nicht der JavaBeans-Spezifikation, also tun Sie es nicht, wenn Sie auf Frameworks oder Tools angewiesen sind, die JavaBeans erwarten. Ansonsten ist es eine nützliche Option.

All diese Dinge sind Implementierungsdetails, die sich hinter der einfachen “Getter and Setter” -Schnittstelle verbergen. Darum geht es bei der Kapselung.

Die Idee von Getter und Setter besteht darin, den Zugriff auf Variablen in einer class zu steuern. Wenn der Wert intern geändert werden muss, um auf andere Weise dargestellt zu werden, können Sie auf diese Weise Code außerhalb der class auflösen.

Angenommen, Sie hatten eine class mit einer Abstandsvariablen, die in Inch gemessen wurde. Ein paar Monate vergehen, verwenden Sie diese class an vielen Orten und Sie bemerken plötzlich, dass Sie diesen Wert in Zentimetern darstellen müssen. Wenn Sie keinen Getter und Setter verwenden, müssen Sie jede Verwendung der class aufspüren und dort konvertieren. Wenn Sie einen Getter und einen Setter verwendet haben, können Sie nur diese Methoden ändern, und alles, was die class verwendet, wird nicht unterbrochen.

 public class Measurement { /** * The distance in centimeters. */ private double distance; /** * Gets the distance in inches. * @return A distance value. */ public double getDistance() { return distance / 2.54; } /** * Sets the distance. * @param distance The distance, in inches. */ public void setDistance(double distance) { this.distance = distance * 2.54; } } 

Ein guter Vorteil ist, dass Sie ein Feld ReadOnly erstellen können, indem Sie einen Setter für dieses bestimmte Feld nicht implementieren.

Es ist nichts falsch daran , Getter und Setter zu verwenden – seien Sie sich bewusst, dass Sie Ihre Variablen offen legen und auf eine Art und Weise gegen die Kapselung verstoßen, indem Sie sie verwenden und öffentlich machen. Das ist es, was der Artikel, den Sie erwähnen, davor warnt: Generieren Sie nicht nur Getter und Setter für alle privaten Instanzvariablen; Denken Sie darüber nach, was Sie anderen classn (und auf welcher Ebene, dh privat / geschützt / öffentlich) zugänglich machen möchten, sodass Sie nur nach Bedarf exponieren.

Hier ist der Nachteil. Getters / Setter tendieren dazu, die Implementierungsdetails Ihrer class der Außenwelt offen zu legen. Das ist keine gute Sache. Stellen Sie sich vor, Sie schreiben ein Automechanik-Softwarepaket. Daher benötigen Sie eine Car-class und stellen Getter und Setter für die Felder bereit

 Date lastOilChangeDate; int lastOilChangeMileage; 

in dieser class. Dies liegt daran, dass die Software E-Mails senden möchte, wenn Kundenfahrzeuge Ölwechsel benötigen.

Aber was passiert, wenn neue Autos herauskommen, in denen Sie feststellen, ob ein Auto einen Ölwechsel anders als “alle 3000 Meilen oder 3 Monate” braucht? Vielleicht haben diese neuen Autos einen Sensor in der Ölwanne, der den Schmutz misst. Offensichtlich möchten Sie damit feststellen, ob ein Ölwechsel erforderlich war.

Das Problem war, dass Sie mit diesen Getter / Setter das falsche Problem getriggers haben. Niemand will wirklich wissen, wann der letzte Ölwechsel war, sie wollen wissen, ob du noch einen brauchst. Sie waren nur Implementierungsdetails, aber Sie haben sie Teil der Schnittstelle gemacht. Was Sie hätten tun sollen, ist eine Methode hinzugefügt worden

 public boolean needsOilChange() 

und dann konnte die Car-class implementieren, wie sie es wollte. Wenn der Algorithmus die Mechanic-class ändert, müsste das nicht, weil alles, was benötigt wird, die needsOilChange-Methode ist.

Dies wird hauptsächlich in Java-Beans wie unten verwendet.

public Class MyBean{

private int var1;

public void setVar1(int pVar1){

this.var1=pvar1;

}

public int getVar1(){

return var1; `

}

}

Vorteile sind wie folgt

1. Damit können wir die Verkapselung erreichen

2. Es wird als DTO- Entwurfsmuster (Data Transfer Object) bezeichnet. Es wird verwendet, um Daten in MVC-basierten Anwendungen von einem Layer auf einen anderen zu übertragen. Wie Sie können Benutzer eingegebene Daten aus dem Formular (mithilfe von Getter) und Sie können die gleichen Daten verwenden, um in die database (mithilfe von Setter) und umgekehrt verca. neueste Frameworks (SPring) bietet es als eingebaute functionalität.