wake-up-neo.net

Encapsulation vs Data Hiding - Java

Interviewer: Was ist Einkapselung und wie erreicht man es in Java?

Me: Encapsulation ist ein Mechanismus zum Ausblenden von Informationen vor dem Client. Die Informationen können Daten oder Implementierungen oder Algorithmen sein. Wir erreichen Sie dies mit Zugriffsmodifizierern. 

Interviewer: Das sind Daten versteckt. Wie erreichen wir die Kapselung in Java?

Me : uummmm

Konkrete Frage: Anders als 'Access Modifiers', wie kann Encapsulation in Java implementiert werden?

43
Sandeep Jindal

Allgemeiner bezieht sich encapsulation einfach auf das Bündeln der Daten (z. B. eines Objekts) mit den Operationen an diesen Daten. Sie haben also eine Klasse, die Daten - Felder - zusammen mit den -Methoden einkapselt, um diese Daten zu bearbeiten.

Die Einkapselung wird jedoch manchmal genauso wie Ihre Antwort verwendet, und in der Tat ist es einer der Punkte beim Bündeln von Daten und Methoden, die Implementierung mit hide zu verbergen.

Ich denke, eine bessere Antwort als verwendet nur Methoden und macht alle Felder privat ist: Schnittstellen verwenden. Auf diese Weise basieren Operationen an einem Objekt ausschließlich auf dem Schnittstellenvertrag und sind in keiner Weise an die Felder oder Hilfsmethoden gebunden, die zur internen Implementierung dieses Vertrags verwendet werden.

36
pb2q

Verkapselung

Im Allgemeinen Encapsulation bedeutet, ähnliche Elemente zu bündeln, so einfach ist das.

Nehmen Sie zum Beispiel eine Student-Klasse, in der die Instanzvariablen der Schüler und Verhaltensweisen/Methoden auf diese Instanzvariablen an einer Stelle wirken.

Warum ist es wichtig? Wir möchten nicht, dass unser Code in unserer Code-Basis verstreut ist.

Wenn wir beispielsweise Änderungen vornehmen müssen, müssen wir an allen Stellen die Varianten (dieser Änderungen) finden. Indem wir ähnliche Elemente bündeln, vermeiden wir solche Szenarien und tragen dazu bei, den gebündelten Code fokussierter zu gestalten.

Daten verstecken

Es bietet lediglich eine Möglichkeit, Ihre Daten vor der Außenwelt zu schützen. Was es bedeutet, sagen wir, wenn ich meine Instanzvariable öffentlich mache, kann jeder seinen Status ändern. Wenn wir unsere Instanzvariable jedoch als privat/geschützt definieren, beschränken wir tatsächlich externe Entitäten darin, Änderungen daran vorzunehmen.

Vergleich/Diskussion

Nun stellt sich die Frage, in welcher Hinsicht werden unsere Variablen geschützt?

Wieder müssen wir verstehen, dass Encapsulation genau der Container ist, den wir zum Platzieren unserer ähnlichen Artikel benötigen.

Es wirkt einfach wie eine Black Box für die Außenwelt. Außerhalb der Welt (ich meine damit Kunden/Konsumenten: Verwendung unserer Student-Klasse) kennen die internen Details/Implementierungsdetails der Student-Klasse nicht und sollten sich nicht um die internen Details/Implementierungsdetails der Klasse kümmern. Sie möchten nur einige Methoden/APIs, damit sie sie in ihrer Clientanwendung verwenden können.

Mein Punkt ist also, dass alle schülerbezogenen Verhaltensweisen/Variablen in einer Black-Box abgelegt werden, die wir als Klasse bezeichnen. Nun liegt es am Designer der Klasse, welche Elemente der Klasse verborgen werden sollen und was nicht vor der Außenwelt verborgen werden darf.

Um auf die Frage in Java zurückzukommen: Wir machen unsere Variablen privat, dh sie sind klassengeschützt. Wenn unsere Instanzvariablen im gesamten Paket verfügbar sein sollen, dann sind sie paketgeschützt. Durch unser Projekt sind sie öffentlich. Was ich damit sagen will, ist das Ausblenden von Daten. Sie benötigen eine Art Container, in dem Sie Ihre Daten ablegen und in Bezug auf Container verstecken.

Also, was ich fühle Data Hiding ist ohne Encapsulation nicht möglich. Sie können Ihre Daten nicht verstecken, ohne sie in eine Art Container zu stellen. Wieder erinnere ich Sie daran, dass ich dies in den Kontext der objektorientierten Sprache einsetze.

Ja Encapsulation ist möglich, ohne Ihre Daten zu verbergen. Stellen Sie alle Dinge öffentlich und Sie können den Effekt sehen.

17
bharatj

Encapsulation: Nehmen Sie das Beispiel einer Kapsel. Wenn Sie es öffnen, enthält es viele Zutaten. Die Einkapselung der objektorientierten Programmierung ist auch so. Wie der Name schon sagt, bedeutet "Encapsulation, alle Datenelemente, Attribute und zugehörigen Methoden in einer einzigen Kapsel zu kapseln (eine Kapsel daraus zu machen).

Wie machst du das: Lasst uns sagen, du hast eine Klasse mit dem Namen "Car" gemacht. Jetzt hat das Auto einen Farbpreis und ein Modell. Dies sind Attribute und es gibt eine Run-Methode. Hier haben Sie alle diese Attribute und Methoden eines Fahrzeugs mit dem Namen "Car" gekapselt. Wenn Sie so eine Instanz von Auto erstellen

Car myCar = new Car();

Sie können mit der Variablen myCar auf alle Attribute von Car zugreifen.

" Data hiding ": Das Ausblenden von Daten wird in Java mit Zugriffsmodifizierern gesteuert. Um auf die Datenmitglieder zuzugreifen, verwenden Sie ACCESSORS, während Sie die Daten ändern, die Sie " Mutators " verwenden. Java stellt keine Accessoren und Mutatoren zur Verfügung, Sie erstellen sie selbst (Getter und Setter). Während C # Eigenschaften bietet, um dies zu tun.

7
Samar Hussain

Ich hasse das, aber aus Wikipedia :

In Programmiersprachen bezieht sich die Kapselung auf einen von zwei verwandte, aber unterschiedliche Begriffe und manchmal auf die Kombination davon:

  1. Ein Sprachmechanismus zum Einschränken des Zugriffs auf einige Komponenten des Objekts.
  2. Ein Sprachkonstrukt, das die Bündelung von Daten mit den Methoden (oder anderen Funktionen) erleichtert, die mit diesen Daten arbeiten

Ihre Erklärung entsprach eher dem ersten Gedanken, der Interviewer suchte im zweiten Teil nach etwas. 

3
Chris Dargis

Data Encapsulation bezieht sich auf den Mechanismus von , wobei alle verwandten Eigenschaften und Methoden in einer einzigen Entität zusammengefasst werden.

Beispiel: Ein Auto. Es hält Lenkräder, Reifen, Motor und alle damit zusammenhängenden Dinge in einer kollektiven Einheit namens Car.

In Programmiersprachen wird die encapsulation mit classes erreicht. Eine Klasse enthält alle Eigenschaften und zugehörigen Methoden in one single entity, die eine bestimmte Aufgabe ausführen sollen.


Daten ausblenden bezieht sich auf versteckt die unwichtigen Details vor dem Benutzer und zeigt ihm nur die relevanten Daten.

Beispiel: Wenn wir in einem Auto auf die Bremse oder das Gaspedal drücken, wissen wir nicht, was sich hinter der Szene abspielt (wie seine Geschwindigkeit erhöht oder wie das Bremsen der Reifen). Alles, was wir wissen, ist, dass wir Bremse und Gas haben, um das gewünschte Ergebnis zu erzielen.

Bei der Programmierung geschieht dies mit Hilfe von access Modifiers. Private -Mitglieder sind nicht zugänglich von außerhalb der Klasse und nur public-Mitglieder sind für Benutzer zugänglich. Auf private Mitglieder kann nur von -Mitgliedern der Klasse aus zugegriffen werden, wodurch das security bereitgestellt wird, damit private Mitglieder direkt von außerhalb der Klasse ausgewertet werden können. 

3
alok kumar

Die Frage erscheint irreführend, ich bezweifle, dass irgendjemand anders als der Interviewer sie möglicherweise beantworten könnte, und es besteht die Möglichkeit, dass seine/ihre Antwort falsch ist. Vor allem ist nicht klar, was die Frage bewerten oder entdecken soll.

Trotzdem habe ich darüber nachgedacht und das Folgende ist meiner Meinung nach mein Versuch, die Frage zu beantworten.

Mit Zugriffsmodifikatoren

In Java wird die Kapselung implementiert, indem Details unter Verwendung der Eingabehilfenmodifikatoren (d. H. Öffentlich, geschützt, privat usw.) ausgeblendet werden. Mit diesen Zugriffsebenen steuern Sie die Ebene, in der Informationen ausgeblendet werden. Je weniger restriktiv die Ebene ist, desto teurer ist die Änderung, wenn sie stattfindet, und desto stärker ist die Kopplung der Klasse mit anderen abhängigen Klassen (d. H. Benutzerklassen, Unterklassen).

Einkapselung ist offensichtlich mehr als nur ein versteckter Zustand. In Java können Sie ganze Klassen und Interfaces sowie deren Status und Verhalten verbergen, indem Sie die Implementierungsdetails einer gesamten API verbergen.

Beispielsweise gibt die Methode Arrays.asList() eine List -Implementierung zurück, aber es ist uns egal, welche Implementierung die öffentliche Schnittstelle List erfüllt, oder? Die Implementierung kann in Zukunft geändert werden, ohne dass wir, die Benutzer der Methode, davon betroffen sind. Die tatsächliche Implementierung ist uns jedoch verborgen.

Bis zu diesem Punkt scheint es so, als hänge die Kapselung vollständig von der Fähigkeit einer Programmiersprache ab, Details zu verbergen, und daher wäre dies nicht ohne Zugriffsmodifikatoren möglich, oder?

Ohne Zugriffsmodifikatoren

Wie erreicht eine Sprache wie Python die Kapselung, wenn sie keine Zugriffsmodifikatoren enthält? Alles ist öffentlich in Python? Heißt das, dass eine Verkapselung nicht möglich ist?

Was ist, wenn wir vereinbarungsgemäß die öffentliche Schnittstelle unserer Komponenten definieren und dann auf den Zustand und das Verhalten der Objekte nur über ihre öffentliche Schnittstelle zugreifen? Dazu brauchen wir natürlich ein klares Verständnis der Abstraktionen in unserer Problemdomäne und wie diese von unseren Nutzern konsumiert werden sollen.

Für mich scheint es so, als ob die Interviewfrage die Verkapselung als ein umfassenderes Konzept bewerten sollte, das von der Definition sehr klarer Abstraktionen abhängt und nicht nur ein Nebenprodukt eines Sprachfeatures wie Zugriffsmodifikatoren ist.

Die Rolle der Abstraktion

Deshalb muss man meiner Meinung nach zuerst die Abstraktion verstehen, um die Verkapselung wirklich zu verstehen.

Denken Sie zum Beispiel an die Abstraktionsebene im Konzept eines Autos. Ein Auto ist in seiner internen Umsetzung komplex. Sie haben mehrere Untersysteme, wie ein Getriebesystem, ein Bremssystem, ein Kraftstoffsystem usw.

Wir haben jedoch die Abstraktion vereinfacht und interagieren mit allen Autos auf der Welt über die öffentliche Schnittstelle ihrer Abstraktion. Wir wissen, dass alle Autos ein Lenkrad haben, über das wir die Richtung steuern. Sie haben ein Pedal, mit dem Sie beim Drücken das Auto beschleunigen und die Geschwindigkeit steuern. Ein anderes, mit dem Sie es zum Stoppen bringen und einen Schalthebel haben So können Sie steuern, ob Sie vorwärts oder rückwärts gehen. Diese Merkmale bilden die öffentliche Schnittstelle der Autoabstraktion. Am Morgen können Sie eine Limousine fahren und dann aussteigen und am Nachmittag ein SUV fahren, als wäre es dasselbe.

Es ist nicht so, dass man die Motorhaube nicht öffnen kann, um zu sehen, wie alles funktioniert. Nur wenige von uns kennen jedoch die Details, wie all diese zugrunde liegenden Funktionen unter der Motorhaube implementiert werden, und die Wahrheit ist, dass wir die Details nicht kennen müssen, um ein Auto zu fahren. All diese Dinge sind in der Autoabstraktion zusammengefasst. Wir müssen nur die öffentliche Schnittstelle der Abstraktion kennen.

Denken Sie an die Zeit, in der Autos kein hydraulisches Leitsystem hatten. Eines Tages haben die Autohersteller es erfunden und beschließen, es von da an in Autos zu stecken. Dies änderte jedoch nichts an der Art und Weise, wie Benutzer mit ihnen interagierten. Allenfalls erfuhren die Benutzer eine Verbesserung bei der Verwendung des Richtungssystems. Eine solche Änderung war möglich, weil interne Implementierung eines Autos gekapselt wurde.

Dies zeigt deutlich, dass sie durch Ausblenden der Details der Art und Weise, wie die Richtungssysteme implementiert wurden, sicher ändern können, ohne die öffentliche Schnittstelle des Autos zu beeinträchtigen und dementsprechend auch ohne die Art und Weise, wie Benutzer damit interagierten.

Stellen Sie sich nun vor, dass die Autohersteller beschlossen haben, den Tankdeckel unter das Auto und nicht auf eine der Seiten zu legen. Sie kaufen eines dieser neuen Autos, und wenn Ihnen das Benzin ausgeht, gehen Sie zur Tankstelle, und Sie finden den Tankdeckel nicht. Plötzlich merkt man, dass es unter dem Auto ist, aber man kann es nicht mit dem Gaspumpenschlauch erreichen. Jetzt haben wir den Vertrag über die öffentliche Schnittstelle gebrochen, und daher bricht die ganze Welt zusammen. Sie zerfällt, weil die Dinge nicht so funktionieren, wie es erwartet wurde. Eine solche Änderung würde Millionen kosten. Wir müssten alle Zapfsäulen der Welt austauschen. Wenn wir die Kapselung brechen, müssen wir einen Preis zahlen.

Wie Sie sehen, besteht das Ziel der Verkapselung darin, die gegenseitige Abhängigkeit zu minimieren und den Wandel zu erleichtern. Sie maximieren die Kapselung, indem Sie die Offenlegung von Implementierungsdetails minimieren. Auf den Status einer Klasse sollte nur über ihre öffentliche Schnittstelle zugegriffen werden.

Das Schöne an der Verkapselung ist die Fähigkeit, Dinge zu ändern, ohne die Benutzer zu beeinträchtigen.

Wir können sagen, dass dieses Endziel von sorgfältiger Planung und Gestaltung abhängt. In Java sind Zugriffsmodifikatoren eine Möglichkeit, diese Ideen zum Leben zu erwecken. In Sprachen, in denen diese Funktion nicht vorhanden ist, ist es jedoch ebenso möglich, eine Kapselung zu erzielen.

2
Edwin Dalorzo

Grundsätzlich ist die Datenkapselung ein Prozess, während das Verbergen von Daten eine Technik ist. In der Kapselung können Daten öffentlich oder privat sein, beim Datenverstecken sind Daten jedoch nur privat. Das Verstecken von Daten verwendet Encapsulation, aber es werden auch andere Techniken verwendet, um zuzulassen, dass Daten nur autorisierten Zugriff erhalten.

1
Ali.Chauhdary

In der Klasse werden Attribute und Verhalten zusammengefügt. Eine Kapselung bedeutet, wenn Sie eine Klasse erstellen, bedeutet dies selbst, dass Sie das Prinzip der Kapselung realisieren. Weil Daten und Verhalten in der Klasse eingeschlossen sind. Das Verstecken von Daten ist daher ein wesentlicher Bestandteil des Begriffs "Kapselung". Und dies bedeutet Zugangspunkte des Objekts.

1
  1. ENCAPSULATION ist die Bündelung der Daten (Felder) und des Verhaltens (Methoden) in Klassen.
  2. Jetzt müssen Sie die Zugriffskontrolle für die Daten mit Zugriffsmodifizierern (privat/geschützt/öffentlich oder Standard), dh DATA HIDING ..__, bereitstellen. Sie schützt Daten vor der Außenwelt, auf die Sie keinen Zugriff gewähren möchten.
  3. Um die Komplexität der Vorgänge zu verbergen, müssen Sie auch Schnittstellen verwenden, um ABSTRACTION zu erreichen.
1
Shahnawaz Khan

Die einfachste Definition für die Kapselung ist "Daten und Code binden, mit dem Daten in einer einzigen Einheit zusammengefasst werden", sodass die Daten nicht direkt von außen zugänglich sind.

In der Struktursprache wie c werden die Daten am Anfang des Blocks deklariert und direkt verwendet, und es wird offen darauf zugegriffen (Jeder Tom, Dick und Harry kann auf Daten zugreifen.) Dick und Harry.
Encapsulation ist eine der Möglichkeiten, um das Ausblenden von Daten zu erreichen .__ Sie erreichen das Ausblenden von Daten, indem Daten und Funktionen zusammengefügt werden (Encapsulation).

Wie Sie in Java arbeiten, finden Sie in den Funktionsbeispielen der Funktion getter (), setter () in Java . Überprüfen Sie dies 

Wie funktionieren Getter und Setter?

1
Aarif Shaikh

Encapsulation bedeutet das Binden von Datenmitgliedern und -methode (Verhalten) in einer einzelnen Einheit und so viele Informationen bereitstellen, wie der Benutzer leicht benötigt, man kann sagen, [encapsulation = Ausblenden von Daten + Abstraktion]. 

Klasse ist ein vollständig in Java gekapseltes Element

Daten ausblenden bedeutet, dass Datenvariablen als privat deklariert werden, um sie vor unberechtigtem Zugriff zu schützen, wenn Sie jedoch eine öffentliche Setter- und Getter-Methode für die Validierung angeben.

1

So wie ich es sehe, bezieht sich Encapsulation auf die Idee von Binding Data und Method auf eine Single Einheit namens - class . Es gibt jedoch zwei Hauptkriterien , um Daten und Methoden zu binden. Eine davon ist das Verstecken von Informationen, nur nicht die einzige. Perfekt zu sein prägnant Ich würde sagen, die beiden Hauptkriterien sind

  1. Geringe Kopplung (durch Ausblenden von Informationen sicherstellen)
  2. Hoher Zusammenhalt
1
Maaz Rehman

Einkapselung: Die Einkapselung ist eine der Säulen von OOPS und wird auch für die beiden anderen Ausdrücke, das Verstecken von Daten und die Abstraktion, verwendet. (Daten verbergen, wie der Begriff bezeichnet. Daten können nur in Variablen gespeichert werden. Um Daten vor der Außenwelt auszublenden, verwenden wir das Konzept zum Verbergen von Daten. Öffentlich, Privat, Geschützt. Hierbei handelt es sich um drei Zugriffsmodifizierer für das Verstecken von Daten beschränkt auf Paket. Geschützt begrenzt auf geerbte Klasse.) ** Auf private Variablen kann nur innerhalb einer Klasse zugegriffen werden. Wenn also eine innere Klasse vorhanden ist, können auch private Variablen direkt aufgerufen werden. Nur statische innere Klassen können statische Variablen aufrufen.

Kommen wir nun zur Abstraktion (Bedeutung: Immateriell). Abstraktion wird auch als Prozess angesehen, um die Implementierung vor dem Benutzer zu verbergen und nur das Endergebnis bereitzustellen. Beispiel: Wir haben eine Personenklasse mit der Eigenschaft "Gewicht". Diese Eigenschaft ist ziemlich schwierig, da wir für eine Person nicht weniger als 0 Gewicht akzeptieren können. Wir können auch nicht mehr als 500 kg akzeptieren. Die Implementierung für diese zu verbergen, liegt also in der Setter-Methode. Dieses Ding, das die Implementierungsdetails versteckt, ist Abstraktion. 

** Und das Complete Package, d. H. Das Objekt als privat deklarieren und die Logik in Setter und Getter implementieren, heißt ENCAPSULATION. 

Ich habe gesehen, dass bereits viele Diskussionen geführt wurden, nur um mein Verständnis zu vereinfachen:

Encapsulation Stellt sicher, dass das Verhalten eines Objekts nur über seine API beeinflusst werden kann. Dadurch können wir steuern, wie stark sich Änderungen an einem Objekt auf andere Teile des Systems auswirken Es gibt keine unerwarteten Abhängigkeiten zwischen Komponenten, die nicht mit zusammenhängen. Der Access-Modifikator kann zur Erzielung der Encapsulation verwendet werden.

Ausblenden von Informationen Verbirgt, wie ein Objekt seine Funktionalität hinter der Abstraktion seiner API implementiert. Es erlaubt uns, mit höheren Abstraktionen zu arbeiten, indem wir untergeordnete Details ignorieren, die nicht mit der vorliegenden Aufgabe zusammenhängen. Die Abstraktion auf Designebene kann verwendet werden, um das Ausblenden von Daten zu erreichen.

1
Sanjay Jain

Das Definieren einer Klasse durch Ausblenden ihrer Daten vor dem direkten Zugriff von außerhalb des Klassenmitglieds und Bereitstellen des Zugriffs nur durch öffentlich zugängliche Setter- und Getter-Methode durch ordnungsgemäße Validierung wird als Encapsulation bezeichnet.

1
YaDav MaNish

Aus Wikipedia

Encapsulation Encapsulation ist ein objektorientiertes Programmierkonzept das bindet die Daten und Funktionen, die die Daten manipulieren, Dies schützt sowohl vor äußeren Einflüssen als auch vor Missbrauch. Daten Die Einkapselung führte zu dem wichtigen OOP Konzept des Versteckens von Daten.

Wenn eine Klasse keinen aufrufenden Code für den Zugriff auf interne Objektdaten zulässt und erlaubt den Zugriff nur durch Methoden. Dies ist eine starke Form von Abstraktion oder Verstecken von Informationen, bekannt als Einkapselung. Etwas Sprachen (z. B. Java) lassen Klassen Zugriffsbeschränkungen erzwingen B. explizit interne Daten mit dem privaten Schlüsselwörter und Bezeichnungsmethoden, die für die Verwendung durch Code außerhalb von .__ vorgesehen sind. Klasse mit dem öffentlichen Schlüsselwort. Methoden können auch öffentlich gestaltet werden, private oder Zwischenebenen wie protected (die den Zugriff auf von derselben Klasse und ihren Unterklassen zulassen, nicht jedoch auf Objekte einer anderen Klasse). In anderen Sprachen (wie Python) wird dies nur von .__ erzwungen. Konvention (private Methoden können beispielsweise Namen haben, die mit einem Unterstrich __ beginnen.) Die Kapselung verhindert, dass externer Code .__ ist. befasst sich mit den internen Abläufen eines Objekts. Dies erleichtert Code-Refactoring, z. B. Erlauben des Autors der Klasse Ändern, wie Objekte dieser Klasse ihre Daten intern darstellen ohne externen Code zu ändern (solange "public" -Methode auf dieselbe Weise aufruft). Es ermutigt auch Programmierer, den gesamten Code einzugeben das betrifft einen bestimmten Datensatz in derselben Klasse, der organisiert es für ein leichtes Verständnis für andere Programmierer . Encapsulation ist eine Technik, die die Entkopplung fördert.

1
Adelin

Das Binden von Datenmitgliedern und entsprechenden Methoden in einer einzigen Einheit ist nichts anderes als Einkapselung.

Encapsulation = Daten ausblenden + Abstraktion

1
Ramesh Kumar

Abstraktion sagt, dass was mit dem Objekt zu tun hat.

Encapsulation bedeutet, Objekteigenschaften, Status und Verhalten in eine einzige logische Einheit einzukapseln, die als Klasse bezeichnet wird.

Das Ausblenden von Daten besagt, dass das Verbergen der inneren Implementierung von Objekten private Methoden und Eigenschaften bedeutet, das Objekt, das zur Aufrechterhaltung ihres Status verwendet wird.

1
Ankit Rana

Das Ausblenden von Daten bedeutet, dass wir Daten innerhalb der Klasse schützen.

Abstraktion bedeutet das Ausblenden des Codes durch Definieren von Elementfunktionen. 

Einkapselung ist die Kombination aus Abstraktion und Datenverstecken, dh wir sind Umhüllung von Daten und Code, der diesen Daten zugeordnet ist. Für Ex-Bean-Klasse

    class student {
private int age;  // Data Hiding 
public setAge(){} // Abstraction 
public getAge(){} // Abstraction 
}

studentenklasse ist gekapselt. 

einkapselung = Daten ausblenden + Abstraktion 

1
Brijesh Rana