2016-05-07 10 views
0

Ich habe eine Verwirrung in wie Getter und Setter Verkapselung bereitstellen. Ich meine, was ist der Unterschied zwischen der direkten Zuordnung von Werten zu Variablen und deren Zuweisung durch Getter und Setter. Nehmen wir an, wir haben zwei Klassen A & B. Während wir Getter und Setter verwenden, um Werte aus Klasse B zu setzen, müssen wir ein Objekt der Klasse A in Klasse B machen, also wie werden die Variablen gekapselt, wenn wir bereits wissen, in welcher Klasse sie sind definiert.Wie verwende ich Getter und Setter für Encapsulation

Antwort

0

Mit Setter können wir zusätzliche Validierung für den angegebenen Wert anwenden, der nicht möglich ist, wenn Sie den Wert direkt der Eigenschaft zuweisen. Ein Beispiel könnte sein, zu prüfen, ob der Wert beispielsweise nicht null ist:

public void setVariable(Object value) { 
    if (value == null) { 
     throw new IllegalArgumentException(); 
    } else { 
     ... 
    } 
} 

Weitere Möglichkeiten Sie mit Setter bekommen, ist, dass Sie zusätzliche Berechnungen anwenden können. Wenn Sie beispielsweise eine BankAccount-Instanz haben und die Zinsen ändern, könnte der Setter eine Neuberechnung der Zinsen veranlassen, die an den Benutzer gezahlt werden müssen.

Eine Möglichkeit, die Sie durch die Anwendung eines Getters erhalten, besteht darin, dass Sie den Standardwert zurückgeben können, falls der Wert noch nicht festgelegt wurde.

Ein anderes Gerät der Getter und Setter beschränkt den Zugriff auf die Variable. Wir könnten zum Beispiel den Getter veröffentlichen, während der Setter geschützt ist. Dies bedeutet, dass jeder die Eigenschaft lesen kann, aber nur Klassen, die die andere Klasse erweitern oder sich im selben Paket befinden, können den Wert festlegen.

In Bezug auf Ihre zweite Frage. Ich verstehe die Frage nicht vollständig. Könntest du etwas mehr dazu sagen?

+0

Vielen Dank für Ihre Antwort. Wie gesagt, meine zweite Frage ist, dass Setter und Getter für die Kapselung verwendet werden, wie wir bereits wissen. Aber wenn wir diese Verkapselung erreichen wollen, müssen wir alle notwendigen Details verbergen. Nehmen wir an, wir möchten den Wert einer Variablen ändern, die in einer Klasse A von Klasse B definiert ist. Also sollte Klasse B nichts außer Setter und Getter haben, damit niemand weiß, in welcher Klasse oder welcher Variablen der Wert gesetzt ist. Aber so wie es gemacht wird, müssen wir ein Objekt der Klasse A in B erstellen, von dem bereits bekannt ist, dass die Variable in welcher Klasse definiert ist. –

+0

Also meine Frage ist, wenn wir bereits wissen, in welcher Klasse die Variablen definiert sind und wir die Werte von dort direkt ändern können, warum verwenden Sie einen viel längeren Prozess des Festlegens des Werts mit Methoden anstatt die Werte mithilfe von object.value –

+0

One Die Gründe dafür sind Kontrolle. Es gibt wahrscheinlich einen Grund, warum die Werte der Klasse A über B gesetzt werden. Es könnte zum Beispiel sein, dass die Klasse B eine Validierung/Berechnung durchführen muss, nachdem sich der Wert der Klasse A geändert hat. Wenn jemand den Wert von A ändern kann, wird die Klasse B niemals von der Änderung von A erfahren, und die Berechnung wird nicht durchgeführt. – uniknow

0

Sie kapseln die Variablen, die sie deklarieren private, so dass andere Klassen nicht ohne eine Getter- oder Setter-Methode darauf zugreifen können. Zum Beispiel:

private int num; //variable to-be defined from constructor 
public int getNum(){ 
return num; 
} 

Andere Objekte kann nicht Zugang der privaten num Variable aus dieses Objekt, ohne die getNum() Methode.

Wenn Sie die gekapselte Variable ändern möchten:

public void changeNum(int n){ 
num = n; 
} 

Die num Variable geändert wird, ohne die Java-Syntax zu brechen.

0

Getters sind öffentlich und Setter sind privat (normalerweise). Dies bedeutet, dass alle Objekte die Variablen unserer Klasse lesen können, aber nur die Objekte unserer Klasse können ihren Wert ändern. Dies bietet eine Verkapselung in dem Sinne, dass "anderen Objekten nicht mehr Zugriff gewährt wird, als sie benötigen". Das ist logisch, denn unsere Klasse ist ein Auto und unser Objekt ist Ferrari. Die neue Variable ist beispielsweise die Pferdestärke des Ferrari. Nur Ferrari-Hersteller können den Wert der Pferdestärke, die Ferrari gibt, ändern. Andere können nur lesen und nicht ändern.

Beantworten Sie Ihre zweite Frage, wenn ein Objekt von A gemacht wird, müssen Sie alle (oder zumindest einige) Variablen von A initialisieren. Dies ist analog zu, in der obigen Analogie, ein neues Ferrari-Auto zu erstellen. Sobald Sie den Ferrari erstellt haben, müssen Sie natürlich alle seine Variablen kennen. Auch hier wird angenommen, dass Klasse B eine "sichere" Klasse ist, sagen wir Main. B kann nicht Mercedes oder Audi sein. (Dies ist etwas, um das sich der Programmierer kümmern muss, wiederum unter Verwendung einer öffentlichen/privaten Kapselung an die Ferrari-Klasse.) Mercedes- oder Audi-Klassen haben nicht die Erlaubnis, ein Ferrari-Auto zu bauen. Nur "Main" und "Ferrari" werden das haben.