Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu?

chaostheory

Bekanntes Mitglied
Hallo,
ich habe mal eine simple Frage: Mein Informatik-Lehrer bläut mir immer ein niemals direkt auf Vairbalen zuzugreifen, sondern immer nur über Getter- und Setter-Methoden.
Aber warum macht man das? Zudem macht es ja dann eigentlich auch die Zugriffsattribute für Variablen sinnlos, da eh jede private ist ???:L
 
G

Gast2

Gast
Weil du nur dann Kontrolle drüber hast was für Werte gesetzt werden können. Hast du z.b. nen int Feld dass nen Alter repräsentiert dann sollte das nicht negativ sein ;)
 
B

bygones

Gast
eine Diskussion die hier schon sehr oft war - es gibt einen FAQ beitrag, eRaaaaa (keine Ahnung wieviele a's) hat was in seinem neuen Blogeintrag geschrieben.

Wenn man pure Immutable Objekte bzw Variablen hat, so braucht man nicht unbedingt getter, aber als Daumenregel kannst du es schon sehen, dass nur die Klasse selber Verantwortlichkeit haben soll, die variablen zu aendern. Niemand sonst

weiterhin hast du die Moeglichkeit intern eine beliebige Implementation deines Vertrauens zu nehmen, nach aussen hin aber nur die Abstraktion zu veroeffentlichen
 

irgendjemand

Top Contributor
da eh jede private ist ???:L

stimmt so nicht ganz ...

in der regel sind alle objekte und variablen grundsätzlich erstmal PACKAGE private ... *kann man auch in den java lanaguage specs nachlesen* ... das bedeutet das man zwar so "von außen" nicht viel mit machen kann ... jedoch können z.b. klassen im selben package und abgeleitete klassen diese immer noch dierekt verändern ... nur wenn man wirklich PRIVATE davor schreibst ist eine variable auch wirklich class-private ...

ansonsten wurde bereits alles genannt :

setter sind dazu da vor allem die gültigkeit der werte zu prüfen die einer bestimmten variable zugewiesen werden sollen ...

und getter verwendet man damit innerhalb der implementierung etwas geändert werden kann OHNE den caller ändern zu müssen ... wenn z.b. der variablenname geändert wurde *was dann zu heftigen ERROR führen kann* ...

außerdem gibt es in java einen grundsatz zu allem was man mit visible-modifier versehen kann : immer nur so public/protected wie nötig , aber immer nur so protected/private wie möglich ...

vielleicht hat dein lehere einfach nur vergessen diesen grundsatz zu erwähnen ...

weiteres findest du zu diesem thema auch in "Java ist auch eine Insel" im abschnitt über variablen ...
 

chaostheory

Bekanntes Mitglied
@irgendjemand
Damit, dass jede Variable private ist, meinte ich, dass man alle Variablen als private deklariert und nur die Getter und Setter individuell deklariert...
 

irgendjemand

Top Contributor
genau so sollte man es ja auch machen ...

nur fehlt mir in deiner antwort dieses "A-HA" ... ergo : scheinbar immer noch nicht verstanden warum das so wichtig ist ?

bleiben wir mal beim bereits gewählten beispiel

wir haben eine klasse "Person" ...
diese klasse enthält eine variable "private int alter"
nun wäre es sicherlich fatal diese dierekt von außen manipulierbar zu machen ...
hier wäre es noch einfach : ein halbwegs "unnormales" alter ... z.b. bei menschen über 150 *der älteste mensch war was um die 130 *wenn ich das noch richtig im kopf hab** ... oder gar ein ungültiges *ein mensch kann einfach kein negatives alter haben*

und genau DAS wird im setter verarbeitet ... es kann hier z.b. geprüft werden ob das alter MIN 0 und MAX 150 ist ... ansonsten wird entweder eine IllegalArgumentException geworfen ... oder falls die signatur des setters "boolean" ist false returned *nach dem motto : setzen des alters fehlgeschlagen* ...


etwas andere probleme bekommst du wenn du das ganze mal auf reflections *dürfte dir sicher nichts sagen* ausdehnst ...
du hast eine wild-fremde klasse die du dynamisch zur runtime nachlädst und versuchst dort eine ganz bestimmte variable mit ihrem namen anzusprechen und zu verändern ...
probleme gibt es dann wenn 1) der modifier nicht stimmt *was man aber mit der reflection-api umgehen kann* oder 2) durch eine externe änderung die variable einen anderen namen hat ... im besten fall passiert einfach nichts ... im schlimmst steigt die VM mit nem ERROR aus ...

oder mach aus dem "int" meinet wegen ein extrem verschachteltes hochkomplexes objekt mit mehreren 100 abhängigen weiteren werten ... da würde es dann gewaltig krachen wenn du dierekt ohne die vom programmierer gegebenen möglichkeiten die variable änderst ...


um auch mal die getter zu beleuchten

manchmal kann es sein das die datenquelle nicht direkt der RAM ist sondern der wert einer variable erst z.b. übers netzwerk von einer datenbank geladen werden muss ...
hier würde dem getter dann die aufgabe zu teil werden sich z.b. um den aktuellen wert im momment des calls zu kümmern ... oder über weitere abfragen zu ermitteln ob der call überhaupt gültig ist ...
auch kann es sein das man noch ein paar zusatz infos braucht um an die info zu kommen die man will ...
oder ganz einfach : das es einfach gar keine variable im RAM gibt und alles "live" z.b. über irgendeinen input kommt ...

was ich damit sagen will : es kann auch vorkommen das du "werte" und "variablen" hast welche aber intern über ihre getter immer wieder live generiert werden und das was im RAM steht nur ein fall-back wert ist falls die aktuelle info nicht ermittelt werden kann ...

klar könnte man in diesem spezialfall auch sagen das man dann die entsprechenen DataSource variablen public machen könnte um selbst mit zu arbeiten ... *security through obcurity ist bei java eh unmöglich* ... aber meist gehts einfach nich


wenn dir auch nach diesem text immer noch nicht klar werden will warum es also wirklich so essentiell wichtig ist das man IMMER getter und setter verwendet ... dann solltest du dir gedanken machen ob du dir den richtigen studiengang ausgesucht hast
 

bERt0r

Top Contributor
Ich versuchs mal mit einer Analogie:
Wenn du Autofahren lernst und im ersten Gang rumfährst, ist es noch relativ egal ob zu zum stehenbleiben die Fußbremse oder die Handbremse nimmst. Dein Lehrer wird dir aber sicher einbläuen, die Fußbremse zu benutzen, weil wenn du später auf der Autobahn die Handbremse reinwirfst, ists zu spät.
So isses auch hier, vielleicht nicht mit ganz so fatalen Konsequenzen. Das prinzip der Datenkapselung wurde nicht entworfen, damit Programmieranfänger mehr zum Schreiben haben, sondern weil man sich damit Zeit spart. Du kannst dir ja mal auf Wikipedie de 10 Zeilen dazu durchlesen: Datenkapselung (Programmierung) ? Wikipedia
 

chaostheory

Bekanntes Mitglied
@irgendjemand
Verstanden hatte ich es schon, aber dein ja sehr ausführlicher Text hat noch mal ein paar neue Zusatzinfos gegeben.
Danke :applaus:

Ich habe bei meinem Programm auch schon Setter, die mehr tun als nur die Variable zu ändern, aber das war mir noch nie so wirklich bewusst, dass das auch zum Getter- u. Setter-System gehört.
Unser Lehrer hat nur etwas übertrieben, wir sollten sogar noch nicht einmal innerhalb einer Klasse direkt auf Variablen zugreifen, und wenn keine Erklärung dazu kommt, stellt man sich dann doch Fragen =)
 

irgendjemand

Top Contributor
chaostheory;866506wir sollten sogar noch nicht einmal innerhalb einer Klasse direkt auf Variablen zugreifen hat gesagt.:
lies dir mal den wikipedia artikel durch

genau das macht man aber im produktiven einsatz ... und zwar gleich aus mehreren möglichkeiten

1) vermeidung von code-duplizierung
2) sicherstellung der daten-konsistenz
3) zeitersparnis / vermeidung von fehlern beim ändern ...

dein lehrer hat also nicht übertrieben ... sondern euch genau das klar gemacht worauf es bei datenkapselung ankommt ... und dazu gehört nun mal auch das man innerhalb einer klasse wo man vermutlich scope auf die eigentliche variable hat trotzdem die gettter/setter nutzt ... gleich wie "sinnlos" einem das vorkommen mag ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Erste Schritte Variablen in abhängigkeit von Git branch Allgemeine Java-Themen 7
Fabiator Variablen Variablen Zählen Allgemeine Java-Themen 3
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Fehler bei Variablen Allgemeine Java-Themen 2
N File Path mit Variablen angeben Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
P static Blocks und variablen Allgemeine Java-Themen 41
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
D BlueJ, Variablen die mehrfach vorkommen gleichzeitig umbenennen Allgemeine Java-Themen 3
C Variablen Variablen mit unendlichem Wert Allgemeine Java-Themen 22
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
T Maximale Felder maximale Variablen Allgemeine Java-Themen 2
W Lebendige Variablen herauslesen Allgemeine Java-Themen 1
K Summierung einer Variablen Allgemeine Java-Themen 5
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
K Static Variablen verbieten Allgemeine Java-Themen 10
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
F Variablen Variablen schachteln Allgemeine Java-Themen 6
7 6 int variablen vergleichen Allgemeine Java-Themen 34
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
K Überschreiben von Variablen bei rekursivem Funktionsaufruf Allgemeine Java-Themen 2
R Übergreifende Variablen? Allgemeine Java-Themen 10
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
C Classloading und statische Variablen Allgemeine Java-Themen 2
K Variablen speichern Allgemeine Java-Themen 2
S Variablen bei Aufruf zurücksetzen Allgemeine Java-Themen 4
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
J Statische Variablen, Threadübergreifend. Allgemeine Java-Themen 4
E Variablen anderer Klassen auslesen (nur Name bekannt) Allgemeine Java-Themen 4
P Variablen in einer anderen Klasse auf Änderungen überwachen Allgemeine Java-Themen 12
V Typargument einer Variablen erfragen Allgemeine Java-Themen 4
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
G Thread variablen Sichtbarkeit Allgemeine Java-Themen 15
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
T Mit JNI finale Variablen überschreiben Allgemeine Java-Themen 14
T JNI -> auf Java-Variablen etc zugreifen Allgemeine Java-Themen 6
M Bezeichnung für Component-Variablen Allgemeine Java-Themen 6
M Variablen an Java-Programm übergeben Allgemeine Java-Themen 3
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
A Überschreibung von Variablen Allgemeine Java-Themen 3
A JavaCC: Variablen zaehlen Allgemeine Java-Themen 12
B globale und lokale Variablen Allgemeine Java-Themen 17
G referenz von variablen Allgemeine Java-Themen 9
O getRuntime().Exec() - Environment - Variablen setzen? Allgemeine Java-Themen 2
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
N Variablen eines Objektes (instanz) in einen Array lesen Allgemeine Java-Themen 7
S In Subklasse auf private Variablen zugreifen Allgemeine Java-Themen 4
S Variablen und ihre Tücken. Allgemeine Java-Themen 7
C Binärbereich einer Variablen abfragen Allgemeine Java-Themen 8
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
J Überschreiben von Variablen Allgemeine Java-Themen 3
C dynamische variablen Namen! Allgemeine Java-Themen 4
M Int und String Variablen verändern Allgemeine Java-Themen 10
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
G Taushen der Input variablen einer method Allgemeine Java-Themen 14
P Objekt- Variablen Allgemeine Java-Themen 16
K Environment Variablen per java -D weitergeben Allgemeine Java-Themen 9
D in class-Dateien nach variablen suchen! Allgemeine Java-Themen 5
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
MQue JButton an verschiedenen Variablen Allgemeine Java-Themen 2
T Unabhängigkeit von Variablen/ Objekten. Allgemeine Java-Themen 6
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
L Sichtbarkeit von Variablen / getMethode Allgemeine Java-Themen 4
H Variablen (A1, A2, A3 mit A_irgendetwas aufrufen) ohne Array Allgemeine Java-Themen 5
M Variablen in einer .doc Vorlage ersetzen Allgemeine Java-Themen 4
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
E Zugriff auf Variablen äusserer Klassen Allgemeine Java-Themen 2
M Variablen in Klasse verpacken? Allgemeine Java-Themen 10
F Allegemeiner Datentyp für Objekte und Primitive Variablen Allgemeine Java-Themen 6
W Array mit Variablen aus Vararg füllen Allgemeine Java-Themen 4
S Problem mit Boolean Variablen Allgemeine Java-Themen 8
A [SOLVED] Classpath und statische Variablen Allgemeine Java-Themen 6
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
C klassenübergreifende variablen Allgemeine Java-Themen 3
J 28 Variablen vergleichen und die höchsten addieren Allgemeine Java-Themen 15
T ungewollter Zugriff auf private Variablen? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben