Datenkapselung

Codix

Bekanntes Mitglied
Mach das. Du hast ja viele Hinweise erhalten. Du kannst gerne noch mal nachfragen, wenn du soweit bist, dann können wir Unklarheiten noch beseitigen.
@temi 2Antwort auf die 2.te Aufgabe: welche ist die beste Möglichkeit? protected, public oder getter?
Begründung: Also ich finde public am besten. Weil wir mit public aus derselben Klasse, demselben Paket, der Unterklasse im gleichen Paket und der Unterklasse im anderen Paket auf die Variablen zugreifen können. Von überall.
TOP 1 = public.
Was sagst du hierzu? @ Temi.

===

3.te Aufgabe: es muss heissen: protected oder public Ziege heissen. So kann man auf die Instanzvariable Ziege zugreifen.

mehr fällt mir hierzu nicht ein.

Hat die Antwort etwas mit der Veränderung des Konstruktors zu tun? z.B. new Ziege(23,'w');

Bitte um eine Antwort.
 
K

kneitzel

Gast
Also zu 2: Das Topic ist doch die Datenkapselung. Wenn Du ein Feld public machst, dann hebst Du die Kapselung komplett auf. Also nicht gut.
Und es kann auch nicht zwischen lesendem und schreibendem Zugriff unterschieden werden.

Zu 3: Da wirfst Du Begriffe durcheinander. Ich sehe keine Instanzvariable Ziege, daher kann deine Antwort nur falsch sein. :)

Aber ja: wenn der Konstruktor private ist, dann kann von außen nicht auf den Konstruktor zugegriffen werden. Damit Instanzen der Klasse erzeugt werden können, muss der Konstruktor zugreifbar sein. Du erwähnst protected und public. Wie sind da jeweils die Zugriffsmöglichkeiten? Und welche erlauben den geforderten Zugriff ("in einem Quelltext in einem anderen Paket")?

Und ist der text bzgl. Datentyp char aus dem ersten Post noch irgendwie akut? Oder hast Du das selbst schon gestrichen oder wurde das im Thread bereits behandelt?
 

Codix

Bekanntes Mitglied
Also zu 2: Das Topic ist doch die Datenkapselung. Wenn Du ein Feld public machst, dann hebst Du die Kapselung komplett auf. Also nicht gut.
Und es kann auch nicht zwischen lesendem und schreibendem Zugriff unterschieden werden.

Zu 3: Da wirfst Du Begriffe durcheinander. Ich sehe keine Instanzvariable Ziege, daher kann deine Antwort nur falsch sein. :)

Aber ja: wenn der Konstruktor private ist, dann kann von außen nicht auf den Konstruktor zugegriffen werden. Damit Instanzen der Klasse erzeugt werden können, muss der Konstruktor zugreifbar sein. Du erwähnst protected und public. Wie sind da jeweils die Zugriffsmöglichkeiten? Und welche erlauben den geforderten Zugriff ("in einem Quelltext in einem anderen Paket")?

Und ist der text bzgl. Datentyp char aus dem ersten Post noch irgendwie akut? Oder hast Du das selbst schon gestrichen oder wurde das im Thread bereits behandelt?


Danke @ JustNobody

Ziege ist keine Instanzvariable, das ist richtig. Ziege ist eine Klasse (in dem Fall).

public: Zugriff von überall möglich.

protected: Wir können aus derselben Klasse, demselben Paket, der Unterklasse im gleichen Paket und der Unterklasse im anderen Paket auf den code zugreifen.

Sollen wir den modifizierer des Konstruktors auf public ändern?

char. darüber haben wir diskutiert. Ich denke, dass char auf int geändert werden muss.

Was denkst du @ JustNobody
 
K

kneitzel

Gast
Ja, public wäre besser, denn Quelltext in einem anderen Paket muss ja keine Unterklasse sein. Daher wäre protected zu wenig.

Und wieso sollte char gewechselt werden? Was ist denn bei int anders oder besser? Was unterscheidet denn die beiden Typen von einander?
 

Codix

Bekanntes Mitglied
back on track mit der Lösung dieser Aufgaben.
@JustNobody:

Der Unterschied zwischen den Datentypen int & char:
int = ganze Zahlen, char = einzelne Character

@Und wieso sollte char gewechselt werden? => wir müssen es nicht wechseln. Dann lass uns char nehmen.


also muss es in der Klasse Ziege :

public class Ziege {
public int gewicht;
public int geschlecht;

heissen.

Sind das die Stellen, die im Quelltext geändert werden müssten, um in einem anderen Paket eine Instanz der Klasse Ziege zu erstellen?

Bitte um eure Antworten, ist die Aufgabe hiermit gelöst?

Danke im Voraus
 

Codix

Bekanntes Mitglied
Nobody schrieb:
Also zu 2: Das Topic ist doch die Datenkapselung. Wenn Du ein Feld public machst, dann hebst Du die Kapselung komplett auf. Also nicht gut.
Und es kann auch nicht zwischen lesendem und schreibendem Zugriff unterschieden werden.

Antwort:
Instanzvariablen sind private. Damit die Subklassen darauf zugreifen können, müssen die Instanzvariablen entweder protected oder public sein - oder du brauchst eine get-Methode dafür.

also auf protected ändern:

Code:
protected int gewicht;

somit hätten wir 2 Lösungsvarianten: get-Methode & Protected.

wir brauchen noch eine Variante (ausser protected), die direkt mit der Veienbarung der Instanzvariablen zusammenhängt.

Was sind eure Lösungen?

Danke im Voraus
 

temi

Top Contributor
somit hätten wir 2 Lösungsvarianten: get-Methode & Protected.

wir brauchen noch eine Variante (ausser protected), die direkt mit der Veienbarung der Instanzvariablen zusammenhängt.
Du hattest schon im allerersten Beitrag für diese Aufgabe drei richtige Varianten angegeben. Das einzige was fehlte war die Bewertung dieser Varianten. Das wurde dir in diesem Thema schon mehrfach mitgeteilt. Hast du eigentlich Probleme Texte (ob nun Aufgaben oder Lösungshinweise) richtig zu interpretieren?
 

Codix

Bekanntes Mitglied
Du hattest schon im allerersten Beitrag für diese Aufgabe drei richtige Varianten angegeben. Das einzige was fehlte war die Bewertung dieser Varianten. Das wurde dir in diesem Thema schon mehrfach mitgeteilt. Hast du eigentlich Probleme Texte (ob nun Aufgaben oder Lösungshinweise) richtig zu interpretieren?

ich dachte die 3 Varianten wären die richtigen, aber anscheinend ist die Variante privat nicht richtig. (s. Kommentare von JustNobody). Deswegen habe ich die letzten Posts geschrieben.

also du sagst. public, protected und get-Methode sind die richtigen 3 Varianten.

Ich bewertete public als die beste Methode (s. vorige threads), aber s. #53 JustNobody's Kommentar zu der public Wahl.

Deswegen blieb nur noch get-Methode und protected übrig, so meine Entscheidung anhand des Data von JustNobody.

aber wir können diese Entscheidung wieder rückgängig machen wegen deiner Bewertung der Lage.
 

Meniskusschaden

Top Contributor
Ich habe den Eindruck, du verstrickst dich in Details, bevor du dir über das Grundsätzliche des Themas Gedanken gemacht hast. Es geht um Datenkapselung. Ist das nun etwas Gutes oder Schlechtes? Will man Datenkapselung erreichen oder verhindern? Warum will man das? Was sind die Vor- und Nachteile? Sobald du das heraus gefunden hast, musst du nur noch bewerten, inwieweit sich die verschiedenen Lösungsansätze im Hinblick darauf unterscheiden. Bevor du das verstanden hast, kannst du nur raten.
 
K

kneitzel

Gast
Neben den Punkten von Meniskusschaden möchte ich nur noch einmal die Aussage "drei richtige Varianten" ansprechen:
public, protected und Getter sind da genannt und für richtig erachtet?

public und (public) Getter können wir abhaken - da hat man von überall aus Zugriff. Aber protected hatten wir ja eigentlich betrachtet:

a) Aufgabe besagt: Zugriff "in einem Quelltext in einem anderen Paket" - also da geht es um irgend einen Quelltext, das muss also keine abgeleitete Klasse sein.

b) Du hast geschrieben: "protected: Wir können aus derselben Klasse, demselben Paket, der Unterklasse im gleichen Paket und der Unterklasse im anderen Paket auf den code zugreifen." wobei ich letzteres zusammenfassen würde zu: Wir können aus derselben Klasse, dem selben Paket oder von Unterklassen zugreifen.

c) Ist protected also eine valide Lösung? Kann ich da von irgend einem Quelltext in einem anderen Paket zugreifen oder nicht? Sprich: Ist es die selbe Klasse? Ist es das selbe Paket? Ist es eine Unterklasse? Wenn Du alles mit Nein beantwortest, dann würde das was genau bedeuten?


Ansonsten probiere es doch einfach aus:
In package1 eine Klasse Test1 mit einem private int variable;
In package2 eine Klasse Test2 (ohne Vererbung!) mit einer Methode:
Code:
public void testAccess() {
  Test1 testInstanz = new Test1();
  testInstanz.variable = 1;
}
(Natürlich mit den notwendigem Krimskrams: package Zeilen in beiden Dateien, Test2 braucht ein Import von package1.Test1 ...)

Lässt sich dies übersetzen oder nicht?
 

temi

Top Contributor
Aufgabe besagt: Zugriff "in einem Quelltext in einem anderen Paket" - also da geht es um irgend einen Quelltext, das muss also keine abgeleitete Klasse sein.
Es geht hier um Aufgabe 2 und die zeigt eindeutig eine abgeleitete Klasse...
public und (public) Getter können wir abhaken - da hat man von überall aus Zugriff.
Es ist eine mögliche Lösung. In Hinblick auf Kapselung eine ungünstige Lösung, aber das muss einfach so in der Bewertung der Lösung geschrieben werden.
 
K

kneitzel

Gast
Ah danke, da habe ich dann etwas aus der Aufgabe 3 mit reingemischt. Blöd, wenn man bei so einem Thread den Ursprungspost mit der Zeit etwas zu sehr aus den Augen verliert.
 

temi

Top Contributor
also du sagst. public, protected und get-Methode sind die richtigen 3 Varianten.
Ich bewertete public als die beste Methode (s. vorige threads), aber s. #53 JustNobody's Kommentar zu der public Wahl.
Deswegen blieb nur noch get-Methode und protected übrig, so meine Entscheidung anhand des Data von JustNobody.
aber wir können diese Entscheidung wieder rückgängig machen wegen deiner Bewertung der Lage.
Mein letzter Versuch in dieser Sache. Ich habe dir ja schon mehrmals geschrieben, dass die Aufgabe eine Bewertung der drei Möglichkeiten verlangt. Die hast du bisher komplett ignoriert. Da das Thema Datenkapselung ist, geht es um eine Bewertung aus Sicht der Datenkapselung. @Meniskusschaden hat es dir ja schon geschrieben und ich stelle es jetzt einfach mal klar: Ja, Datenkapselung ist gut und gewollt. Je gekapselter, desto besser.

Mit dieser Information sollst du die drei o.g. Möglichkeiten bewerten.
 

temi

Top Contributor
Es geht doch um einen Vergleich oder? Und dieser dürfte schon ausdifferenziert sein, falls du weißt was das bedeutet...
Ich habe keine Ahnung was du mir sagen möchtest, Tobias. Es geht doch nicht um einen Vergleich. Es geht darum die drei genannten Möglichkeiten in Bezug auf ihren Einfluss auf die Datenkapselung zu bewerten. Da es sich nicht um meine Aufgabe handelt, werde ich das ganz sicher nicht tun. Das kann @Codix ruhig selbst machen.
 
K

kneitzel

Gast
Ein Vergleich ist erst einmal nur eine Ermittlung von Unterschieden. Aber es geht uns um eine Bewertung. Damit ist es kein reiner Vergleich sondern geht deutlich darüber hinaus.

Und im Gegensatz zu Dir versuchen wir, Leute nur zu führen, so dass sie verstehen und selbst die Lösung erarbeiten. Daher bringen wir eben keine Lösung sondern erwarten da einen entsprechenden Einsatz vom TE.

Und somit ist es erst einmal egal, wie man das nun nennt. Wenn du es unbedingt Gegenüberstellung nennen willst, dann nenn es so. Um Begriffe zu streiten bringt uns / den TE nicht wirklich weiter.
 

temi

Top Contributor
Ist aber auch egal, schau nach was eine Gegenüberstellung ist: "Vergleich zwischen zwei Dingen"
  1. Den Begriff "Gegenüberstellung" hast du ins Spiel gebracht.
  2. Da es sich um drei Dinge handelt, kann es sich nicht um eine Gegenüberstellung handeln ;)
@Codix: Wenn du Verständnisprobleme z.B. mit dem Begriff "Datenkapselung" hast, dann kannst du hier gerne danach fragen und es werden sich sicher Helfer finden, die es dir erläutern können. Dieses Verständnis ist hier wichtig.
 

Codix

Bekanntes Mitglied
also nochmals:
ich habe jetzt folgende Lösungsvorschläge als richtig empfunden und will wissen, was ihr dazu denkt:

Aufgabe1:

Sie haben folgende Klassenvereinbarung:

public class Elefant{
int gewicht;
int groesse;
}

Die Klasse Elefant befindet sich in einem Paket tiere. Kann eine andere Klasse, die sich im Paket meinetests befindet, direkt auf die Werte der Instanzvariablen gewicht und groesse der Klasse Elefant zugreifen? Begründen Sie bitte Ihre Antwort.

Lösung:
Nein, da die Variablen default im private sind. Erst mit gettern und settern ist das möglich.


Aufgabe2:

Sie haben folgende Klassenvereinbarungen in getrennten Quelltextdateien:

package tiere;

public class Katze {

private int gewicht;

private int farbe;

private int groesse;

}

package tiere;

public class ElternKatze extends Katze {

private int kinderzahl;

}

Die Klasse ElternKatze soll auf die Instanzvariable gewicht der Klasse Katze zugreifen können. Welche Möglichkeiten kennen Sie, diesen Zugriff zu ermög
lichen? Bewerten Sie diese Möglichkeiten bitte auch. Achten Sie dabei besonders auf die Datenkapselung.

Ein Tipp: Sie sollten mindestens drei verschiedene Varianten nennen können. Zwei hängen direkt mit der Vereinbarung der Instanzvariablen zusammen, die dritte dagegen nicht.

Lösung:
Das ist einmal über eine Parameterübergabe im Konstruktor möglich, sowie mit gettern und settern oder aber man setzt die variablen nicht private sondern public oder protected.


Aufgabe3:

Bitte sehen Sie sich die folgende Klassenvereinbarung genau an.

public class Ziege {

private int gewicht;

private char geschlecht;

//ein Konstruktor

private Ziege(int gewicht, char geschlecht) {

this.gewicht = gewicht;

this.geschlecht = geschlecht;

}…


Können Sie in einem Quelltext in einem anderen Paket eine Instanz der Klasse Ziege erstellen? Begründen Sie bitte Ihre Antwort und nennen Sie gegebenenfalls die Stellen im Quelltext der Klasse Ziege, die geändert werden müssten.

Lösung:
Nein, da der Konstruktor in private ist. Dieser sollte public sein.
Also: public Ziege(…



Die Lösungen wurden fett geschrieben.

Was denkt ihr über die Lösungen? Sind sie richtig?


Danke im Voraus

Codix
 

temi

Top Contributor
Nein, da die Variablen default im private sind. Erst mit gettern und settern ist das möglich.
Das "Nein" ist richtig, aber Instanzvariablen sind nicht default "private".

Das ist einmal über eine Parameterübergabe im Konstruktor möglich, sowie mit gettern und settern oder aber man setzt die variablen nicht private sondern public oder protected.
Wie soll denn der Zugriff über Parameterübergabe funktionieren?
Getter/Setter ist richtig.
Public/protected ist auch richtig.
Es fehlt die Bewertung, der unterschiedlichen Lösungen in Hinblick auf die Datenkapselung.

Nein, da der Konstruktor in private ist. Dieser sollte public sein.
Das ist richtig.
 

Codix

Bekanntes Mitglied
Das "Nein" ist richtig, aber Instanzvariablen sind nicht default "private".
wie sind sie dann?

Wie soll denn der Zugriff über Parameterübergabe funktionieren?
Man übergibt die Parameter mit dem Konstruktor und hat die Parameter.

Getter/Setter ist richtig.
Public/protected ist auch richtig.
Es fehlt die Bewertung, der unterschiedlichen Lösungen in Hinblick auf die Datenkapselung.
ich denke dass Getter & Setter die beste Lösung ist im Hinblick auf die Datenkapselung, weil es die sicherste Methode ist.
als 2.tes würd eich public/protected nehmen & als 3.te Möglichkeit die Parameterübergabe.

was denkt ihr dazu?

Danke im Voraus, Ihr seid Klasse.
 
Zuletzt bearbeitet von einem Moderator:

temi

Top Contributor
Man übergibt die Parameter mit dem Konstruktor und hat die Parameter.
Da Instanzvariablen sind private, d.h. nur die Klasse Katze hat Zugriff darauf. Wie sollen die als Parameter eines Konstruktors der Klasse ElternKatze verwendet werden? Zeig mal den Code dazu!

ich denke dass Getter & Setter die beste Lösung ist im Hinblick auf die Datenkapselung, weil es die sicherste Methode ist.
als 2.tes würd eich public/protected nehmen
Sicherheit in Bezug auf was? Die Instanzvariablen public oder sie protected zu machen sind schon zwei Möglichkeiten und sie unterscheiden sich auch immens in Hinblick auf Datenkapselung. Überdenke deine Bewertung noch einmal und versuch endlich eine ordentliche Bewertung für jede der drei Möglichkeiten zu machen. Das ist schon seit der ersten Seite dieses Themas dein Hauptproblem bei dieser Aufgabe.
 

Codix

Bekanntes Mitglied
Da Instanzvariablen sind private, d.h. nur die Klasse Katze hat Zugriff darauf. Wie sollen die als Parameter eines Konstruktors der Klasse ElternKatze verwendet werden? Zeig mal den Code dazu!


Sicherheit in Bezug auf was? Die Instanzvariablen public oder sie protected zu machen sind schon zwei Möglichkeiten und sie unterscheiden sich auch immens in Hinblick auf Datenkapselung. Überdenke deine Bewertung noch einmal und versuch endlich eine ordentliche Bewertung für jede der drei Möglichkeiten zu machen. Das ist schon seit der ersten Seite dieses Themas dein Hauptproblem bei dieser Aufgabe.

ich komme einfach nicht drauf, kannst du mir mit der Antwort bitte helfen?
 
K

kneitzel

Gast
ich komme einfach nicht drauf, kannst du mir mit der Antwort bitte helfen?
Das war ja, worauf @temi dich stoßen wollte: das mit den Parametern macht keinen Sinn. Es geht um Zugriff auf die Instanzvariablen. Da macht eine Übergabe als Parameter keinen Sinn. Parameter werden immer über Call by Value übertragen. Somit kannst du nur die aktuellen Werte der Instanzvariablen übergeben. Die Frage war aber, wie man Zugriff auf die Instanzvariablen bekommen kann.

Und die Bewertung steht immer noch aus. Drei Optionen sind genannt worden von Dir: Bewerte die bitte noch. Was für Vor- und Nachteile hat jede Variante bezüglich Datenkapselung?
 

Codix

Bekanntes Mitglied
Das war ja, worauf @temi dich stoßen wollte: das mit den Parametern macht keinen Sinn. Es geht um Zugriff auf die Instanzvariablen. Da macht eine Übergabe als Parameter keinen Sinn. Parameter werden immer über Call by Value übertragen. Somit kannst du nur die aktuellen Werte der Instanzvariablen übergeben. Die Frage war aber, wie man Zugriff auf die Instanzvariablen bekommen kann.

Und die Bewertung steht immer noch aus. Drei Optionen sind genannt worden von Dir: Bewerte die bitte noch. Was für Vor- und Nachteile hat jede Variante bezüglich Datenkapselung?

ich komme auf keine bessere Bewertung, tut mir leid. Könnt ihr mir bei der Bewertung bitte helfen?
 
K

kneitzel

Gast
Kannst du denn beschreiben, was Datenkapselung ist? Evtl. mal den Linke aus #79 gelesen?

Da sind ja Vor- und Nachteile benannt. Da kannst Du dann ja mal schauen, was bei den jeweiligen Lösungen zutrifft oder nicht zutrifft.

Das wäre aus meiner Sicht eine Vorgehensweise, die Sinn machen könnte....
 

Codix

Bekanntes Mitglied
Bewertung: bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können. Innerhalb des Konstruktors scheint mir als keine gute Lösung, da je nach Variableanzahl der Konstruktor unübersichtlich wird.

was haltet ihr von dieser Bewertung?
 

temi

Top Contributor
Bewertung: bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können. Innerhalb des Konstruktors scheint mir als keine gute Lösung, da je nach Variableanzahl der Konstruktor unübersichtlich wird.

was haltet ihr von dieser Bewertung?
Leider nicht so viel :(

Das mit dem Konstruktor sollte doch abgehakt sein; es ist keine durchführbare Lösung für das Problem.

Kannst du kurz erläutern was du unter Datenkapselung verstehst? Ist es besser Daten zu kapseln oder eher nicht?

Da du anscheinend noch Probleme mit den Zugriffsmodifizierern hast, hier noch einmal eine Übersicht:

ModifierClassPackageSubclassWorld
publicYYYY
protectedYYYN
no modifierYYNN
privateYNNN
 

Codix

Bekanntes Mitglied
Datenkapselung in Java: Hauptsächlich Festlegung der Sichtbarkeit von Methoden und Variablen. Es ist besser Daten zu kapseln, weil sie somit sicherer sind. Sonst könnte ja jede/r drauf zugreifen.
 

temi

Top Contributor
Datenkapselung in Java: Hauptsächlich Festlegung der Sichtbarkeit von Methoden und Variablen. Es ist besser Daten zu kapseln, weil sie somit sicherer sind. Sonst könnte ja jede/r drauf zugreifen.
Passt doch im Grunde genommen. Es geht im Grunde darum, dass eine Klasse ihre Interna so weit wie möglich verbergen sollte. Änderungen von außen, sollten idealerweise über fachliche Methoden erfolgen.

Das nur am Rande: Fachliche Methode meint z.B.
Java:
// Eine Klasse Auto
Auto auto = new Auto();
auto.geschwindigkeit = 50; // schlechte Lösung, weil direkter Zugriff
auto.setGeschwindigkeit(50); // besser, aber immer noch fast direkter Zugriff
auto.beschleunigen(); // fachliche Methode: ein Auto wird beschleunigt

Jetzt nimm die Tabelle oben und bewerte die möglichen Lösungen. Aktuell sind die Instanzvariablen "private", d.h. nur mittels Zugriffmodifizierern hast du folgende drei Möglichkeiten:
package private, protected, public.
 

Codix

Bekanntes Mitglied
bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können.

Zugriffsmöglichkeiten:
Getter/Setter
Public/protected

Was ist dann die dritte Möglichkeit? Kann bitte eine/r helfen?
 
K

kneitzel

Gast
Was hast du schon wieder mit dem Konstruktor?

Die Aufgabe besagte doch:
Die Klasse ElternKatze soll auf die Instanzvariable gewicht der Klasse Katze zugreifen können. Welche Möglichkeiten kennen Sie, diesen Zugriff zu ermöglichen? Bewerten Sie diese Möglichkeiten bitte auch. Achten Sie dabei besonders auf die Datenkapselung.

Ein Tipp: Sie sollten mindestens drei verschiedene Varianten nennen können. Zwei hängen direkt mit der Vereinbarung der Instanzvariablen zusammen, die dritte dagegen nicht.

Also 3 Varianten. 2 bezüglich Vereinbarung der Instanzvariablen (protected / public) und 3. waren Getter/Setter ... Wieso reitest Du auf dem Konstruktor herum? Was kannst Du im Konstruktor von Katze oder ElternKatze machen, so dass ElternKatze Zugriff auf die beiden Instanzvariablen bekommt?

Also entweder kennst Du eine Möglichkeit im Konstruktor, dann solltest Du diese klar benennen / Code zeigen. Oder wenn Du da doch keine Lösung siehst, dann vergiss es in diesem Zusammenhang.

Datenkapselung in Java: Hauptsächlich Festlegung der Sichtbarkeit von Methoden und Variablen. Es ist besser Daten zu kapseln, weil sie somit sicherer sind. Sonst könnte ja jede/r drauf zugreifen.

Und was die Datenkapselung angeht: https://de.wikipedia.org/wiki/Datenkapselung_(Programmierung) war schon einmal genannt. Das ist zwar recht kurz, aber es enthält diverse Punkte als Vor- und Nachteil. Hast Du Dir das einmal angesehen? Da sind 5 Vorteile genannt. Angesehen und verstanden?

Diese Aussage von Dir würde mir so nicht reichen, denn es ist einiges nicht wirklich enthalten.
 
K

kneitzel

Gast
bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können.

Zugriffsmöglichkeiten:
Getter/Setter
Public/protected

Was ist dann die dritte Möglichkeit? Kann bitte eine/r helfen?

Du hast doch drei Möglichkeiten genannt:
1. Instanzvariablen public machen
2. Instanzvariablen protected machen
3. Getter / Setter erstellen

Datenkapselung beinhaltet, dass nicht direkt auf die internen Daten zugegriffen werden kann sondern nur über eine Schnittstelle. Dadurch sind die Internas der Klasse wirklich nur intern und die Klasse kann jederzeit angepasst werden. Also wenn man Gewicht und Farbe betrachtet, dann kann die Variable jederzeit geändert werden:
Die Farbe ist derzeit ein int Wert. Das soll evtl. später eine Instanz einer Klasse Farbe sein. Dann kann es dennoch weiterhin eine Methode int getFarbe() geben, in der dann von der Farbe-Instanz erst irgend ein int Wert ausgerechnet wird.

Oder Gewicht: getGewicht() gibt von mir aus das Gewicht in Gramm zurück. Aber die Applikation wird leider vor allem in den USA entwickelt und die wollen das nicht mehr in Gramm angeben. Die haben halt ihre Ounce und speichern daher das Gewicht als double in ounce. Dann gibt halt getGewicht() das Gewicht in Ounce * 28,35 zurück.
Oder vielleicht speichert man auch einfach das Volumen + spezifisches Gewicht und dann berechnet getGewicht daraus das Gewicht der Katze?
Was weiss ich, auf was für Ideen da ein Entwickler kommen kann....

Was die Katze intern also genau speichert ist das Geheimnis der Katze. Es gibt lediglich ein Interface nach Außen, das definiert und eingehalten werden muss (also z.B., dass int getGewicht() das Gewicht der Katze in Gramm ausgibt).
 

Codix

Bekanntes Mitglied
Danke& Respekt an alle!

drei Möglichkeiten:
1. Instanzvariablen public machen
2. Instanzvariablen protected machen
3. Getter / Setter erstellen

Bewertung: bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können.

===

kann man das so stehen lassen?
 

temi

Top Contributor
Danke& Respekt an alle!

drei Möglichkeiten:
1. Instanzvariablen public machen
2. Instanzvariablen protected machen
3. Getter / Setter erstellen

Bewertung: bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können.

===

kann man das so stehen lassen?
Hast du dir die Tabelle weiter oben mal angeschaut?

Bei protected können die Variablen aus dem selben Paket und aus abgeleiteten Klassen verändert werden.

getter/setter haben natürlich ebenfalls Sichtbarkeitsmodifizierer. Sie können public sein oder auch private (sinnlos) package-private oder protected.

Geht man von public getter/setter aus, dann würde mir eine bessere Lösung einfallen als 3. Immer daran denken es geht um Kapselung und mehr Kapselung ist besser!
 

Ähnliche Java Themen

Neue Themen


Oben