In der objektorientierten Programmierung hatte ich diese Frage und tue es immer noch:
Was wäre der Vorteil, wenn wir ein Klassenmitglied als privat deklarieren würden wird dafür einen public getter und einen public setter erstellen?
Ich sehe keinen Unterschied auf der Sicherheitsstufe zwischen dem obigen Fall und dem Fall, dass das Klassenmitglied als öffentlich deklariert wird.
Danke!
Die Einkapselung bietet das Verstecken von Daten und mehr Kontrolle über die Elementvariablen. Wenn ein Attribut öffentlich ist, kann jeder darauf zugreifen und ihm einen beliebigen Wert zuweisen. Wenn Ihre Mitgliedsvariable jedoch privat ist und Sie einen Setter dafür bereitgestellt haben. Dann haben Sie immer die Möglichkeit, einige Einschränkungen in die Setter-Methode zu setzen, um zu vermeiden, dass ein unlogischer Wert eingestellt wird.
Zum Beispiel eine Klasse mit nur öffentlichem Mitglied:
%Vor%Gleiche Klasse mit privatem Mitglied und einem Setter:
%Vor%Wenn Ihre Klasse keine zu wartenden Invarianten hat, dann ist es sinnlos, öffentliche Getter und Setter für ein privates Datenmitglied zu schreiben; Sie sollten nur ein öffentliches Datenelement verwenden.
Wenn Sie jedoch Invarianten pflegen möchten, können Sie mit einem Setter die Werte einschränken, die dem Datenelement zugewiesen werden können.
Beachten Sie, dass, nur weil Sie ein Datenelement haben, nicht bedeutet, dass Sie Getter oder Setter dafür schreiben müssen.
Ärgern Sie sich: "Was aber, wenn sich die Einbauten ändern?" Es ist egal. Sie hatten eine Funktion getName
, die eine std::string const&
zurückgegeben hat. Getter reduzieren die Kapselung, da sie Ihre Auswahl einschränken, wenn Sie später die Implementierung ändern.
Ihre Frage ist in der Tat der Unterschied zwischen Feldern und Eigenschaften. Fileds sind normalerweise privat und Eigenschaften setzen sie aus. Bellow ist ein Zitat einer brillanten Antwort auf SO:
Eigenschaften setzen Felder frei. Felder sollten (fast immer) aufbewahrt werden privat zu einer Klasse und über get und set Eigenschaften zugegriffen. Eigenschaften Stellen Sie eine Abstraktionsebene zur Verfügung, mit der Sie die Felder währenddessen ändern können nicht die äußere Art beeinflussen, auf die sie von den Dingen zugegriffen werden Verwenden Sie Ihre Klasse.
Was ist der Unterschied zwischen ein Feld und eine Eigenschaft in C #?
In C # automatische Eigenschaften erstellen ein Feld für Sie, ohne es manuell deklarieren zu müssen:
%Vor%Schnell (und ein bisschen dumm) Beispiel:
%Vor%Kurz gesagt: Sie gewinnen die Kontrolle und können sicherstellen, dass die Werte korrekt sind. Es heißt Einkapselung.
Ich sehe keinen Unterschied auf der Sicherheitsstufe zwischen dem obigen Fall und dem Fall, in dem das Klassenmitglied als öffentlich deklariert wird.
Sofortige Frage sind:
1) Was ist, wenn Sie einige Bedingungen überprüfen möchten, während Sie den Wert festlegen?
2) Was ist, wenn die Teilklassen etwas anderes zurückgeben oder setzen wollen, indem sie diese Methode übergehen?
Anderer Grund: Warum getter und Setter sind besser als öffentliche Felder in Java
Wenn Sie ein Datenübertragungsobjekt haben, mit begrenztem Umfang und von Entwurf sollte es keine Logik zugeordnet haben, ich sehe keinen Wert in Getter und Setter.
Wenn Sie jedoch eine Komponente haben, der möglicherweise eine Logik zugeordnet ist oder die nicht weit verbreitet ist, ist es sinnvoll, die Details der Datenspeicherung zu verbergen. Anfangs könnte es so aussehen, als ob alle Getter und Setter trivial sind und nur Ihre Klasse füllen, aber im Laufe der Zeit können Sie den Setter eine Validierung hinzufügen und sogar die Getter ändern. z.B. Sie könnten ein Feld löschen (und in Zukunft eine Konstante zurückgeben), die Daten in einem delegierten Objekt speichern oder den Wert aus anderen Feldern berechnen.
Denken Sie neben der -Einkapselung an eine Situation, in der Ihr -Setter nicht einfach einen Wert festlegt.
Was ist, wenn Sie es in vielen Klassen verwenden? Und jetzt erkennen Sie, dass Sie die Funktionalität ändern wollen? Sie müssen es an ganzen Stellen ändern, an denen Sie es manuell einstellen. Wenn du einen Setter hättest, wäre das Leben einfacher gewesen.
Accessor-Methoden bieten einen einzigen Aktualisierungspunkt für ein bestimmtes Feld. Dies ist vorteilhaft, weil die Validierungslogik oder andere Änderungen am Feld über die einzige Methode gesteuert werden können, anstatt auf das Feld direkt innerhalb der Codebasis zuzugreifen.
Siehe dieses IBM Dokument, das weitere Vorteile aufzeigt: Ссылка
>Wenn der öffentliche Getter und der öffentliche Setter nur den Wert des privaten Eigentums zurückgeben und seinen Wert ändern sollen, sehe ich keinen Unterschied.
Sie implementieren jedoch die Kapselung, sodass Sie zu einem späteren Zeitpunkt ein anderes Verhalten implementieren können, z. B. die Überprüfung von Argumenten für Setter oder schreibgeschützte / schreibgeschützte Eigenschaften.
Wenn Sie sich alleine in einem kleinen Projekt entwickeln und Ihren Code nicht wiederverwenden, ist das eigentlich nutzlos, aber es ist meistens ein guter Habit.
Aber in der Teamentwicklung müssen Sie möglicherweise etwas Kontrolle über Änderungen haben, und Sie können dies über die Getter und Setter tun.
Außerdem haben Sie in einigen Klassen nur Getter, da die Setter vom Konstruktor oder über andere Funktionen ausgeführt werden.
Das Deklarieren von Variablen als private
wird als Encapsulation in Java
bezeichnet.
Hier sind einige Vorteile der Verwendung von Encapsulation beim Schreiben von Code in Java oder einer objektorientierten Programmiersprache:
- Gekapselter Code ist flexibler und kann mit neuen Anforderungen einfach geändert werden.
- Die Einkapselung in Java erleichtert das Komponententesten.
- Encapsulation in Java ermöglicht Ihnen zu kontrollieren, wer auf was zugreifen kann.
- Encapsulation hilft auch, unveränderliche Klasse in Java zu schreiben, die eine gute Wahl in Multithreading sind Umgebung.
- Verkapselung reduziert die Kopplung von Modulen und erhöht die Kohäsion in einem Modul, weil alles ein Ding ist sind an einer Stelle gekapselt.
- Encapsulation ermöglicht es Ihnen, einen Teil des Codes zu ändern, ohne andere Teile des Codes zu beeinflussen.
ein weiterer Vorteil ist
Indem Sie Variablen in Java privat machen und Getter und Setter für sie bereitstellen, wird Ihre Klasse kompatibel mit der Java-Bean-Namenskonvention
Wie bei jeder Kapselung: Es verbirgt die Implementierungsdetails. Auf diese Weise können Sie den Zugriff steuern und eine stabile Schnittstelle bereitstellen, selbst wenn sich die Interna ändern.
Ich habe nur eine Sache zu den ausgezeichneten Antworten hinzuzufügen, die dieser Beitrag bisher hat.
Manchmal kann ein Klassenattribut mehr als einen Getter oder Setter haben, lassen Sie uns das mit einem dummen kurzen Beispiel illustrieren:
%Vor%Es ist sinnlos, den Wert für jeden Einheitentyp, den Sie bearbeiten möchten, mehr als einmal zu speichern. Daher stellen die Getters und Setter eine Schnittstelle bereit, die die Klasse in die Lage versetzt, mit verschiedenen Einheiten zu arbeiten.
IMHO, wenn ein Objekt aktive Attribute enthält (Attribute, die nach oder vor der Zuweisung oder dem Zugriff arbeiten müssen), muss es ein class
mit nur den wesentlichen Getters und Setter sein (die privaten Attribute, die nicht benötigt werden) Zugriff außerhalb der Klasse, benötigt offensichtlich keine öffentlichen Getters und Setter).
Wenn andererseits ein Objekt nur passive Attribute enthält (Attribute, die nicht zusätzliche Arbeit erfordern, wenn sie zugewiesen oder aufgerufen werden), muss es ein struct
sein und daher sind alle seine Attribute öffentlich zugänglich ohne Getters und Setter.
Beachten Sie, dass diese Antwort aus den c ++ stammt Sicht der diese Frage für weitere Informationen.
Eines der wichtigsten Konzepte objektorientierter Programmierung ist die Kapselung. Sie kapseln Daten und die Methoden zusammen, die auf diese Daten wirken. Idealerweise sollte auf Daten nur über die zugehörigen Methoden zugegriffen werden. Und der Zustand der Daten sollte von anderen Objekten über diese Methoden "abgefragt" werden. Wenn Sie eine Variable public machen, wird diese Variable direkt für alle anderen Objekte verfügbar, die die Kapselung aufheben.