hi
ich habe eine Arbeit in Informatik geschrieben und für folgende erklärung von gettern und settern nur 1,5/4 Punkten erhalten.
kann mir einer meine Fehler aufzeigen? Der Lehrer schreibt leider keine Kommentare an die Aufgaben )=
Die Aufgabe war: Geben sie an was Getter und Setter (alternativ als Get-Funktionen und Set-Funktionen bezeichnet) und wozu diese benötigt bzw. verwendet werden.
Antwort:
Get- und Set-Funktionen werden verwendet, um Variablen in eine private Klasse hinein und heraus
zu transportieren zu können. Auf Variablen in Klassen mit der Vorgabe privat kann man nicht ohne
weiteres zugreifen. Die Variablen müssen erst mit einer get Methode abgerufewn werden. So eine
Methode hat normalerweise nur den Inhalt „return variable;“. Durch das Aufrufen der Get Methode
vom Außen erhält die aufrufende klasse nun die Variable. Mit einer set-methode ist das fast genau so
nur, dass die Methode Parameter hat, die angeben sollen, wie der neue wert der zu
überschreibenden Variable lauten soll.
In der Standart Set-Methode steht nur die Zeile: „variable = parameter;“ , wobei die variable die zu
überschreibende variable ist. Diese Methoden haben Namen wie getVariable oder setVariable.
Hm "Get- und Set-Funktionen werden verwendet, um Variablen in eine private Klasse hinein und heraus
zu transportieren"
Es werden Werte "transportiert" vielleicht schreibst du "...um private Variablen zu setzen bzw. zu lesen" (ob die Klasse privat ist oder nicht spielt keine Rolle)
Es ist überall so - nicht die Variablen werden bewegt sonder Werte gelesen und geschrieben, aber der Grundansatz ist nicht schlecht.
Es gibt keine privaten Klassen (nur public oder package private alias default, außer inneren Klassen aber da verhält es sich ja allgemein anders), und auf private Variablen "nicht ohne weiteres zugreifen" klingt komisch. Man kann aus der gesamten Klasse darauf zugreifen.
Mehr fällt mir nicht auf.
Wo steht denn das Getter & Setter public sein sollten?
private oder package protected Getter und Setter nutzen nicht viel.
Dazu fehlt imho die Referenz auf die JavaBeans Spek, daher kommt das ja mit den Gettern und Settern.
Schwierig zu sagen warum dein Lehrer dir die Punkte gegeben hat, kann ja nicht wissen was er hören wollte bzw. was ihr so durchgenommen hattet.
Ein Get/Set wird verwendet um eine Variable einer Klasse zu lesen/schreiben. Die Klasse darf durchaus public sein. Ob die Variable ein (privates) Feld ist, oder eine Variable einer anderen Klasse, oder nur im Getter berechnet wird, ist dabei egal. Die Get/Set Methoden sind eine Abstraktion - eine immer gleiche Darstellung einer Variable (wenn sich was aendert, musst du weniger umschreiben...). Normalerweise wird aber schon von einem privatem Feld ausgegangen.
Der Setter kann auch gleich noch testen, ob der neue Wert legal ist, und allenfalls eine Exception werfen falls nicht.
Hm - also private getter und setter sind ja schon eher seltsam - da kann man ja genau so gut direkt auf die Member zugreifen (Wenn die getter und setter wirklich nicht mehr machen als die Werte zu getten und setten ;-) )
Man könnte schon noch viel mehr schreiben:
setter können
- Wertbereiche überwachen
- Werte vorverarbeiten
- ...
getter können
- Werte aus vorhandenen Varaiblen berechnen
- komplexere Abfragen kapseln
- ...
Dadurch kann die Instanz zwar nur in der eigenen Klasse erzeugt werden, der Klassenzugriff, wenn sie die Referenz bekommt ist aber immer noch da.
Aber ich denke, das ist wieder Haarspalterei. Hab oft andere Ansichten und Ausdrücke.
Denk am Besten garnicht mehr daran, das verdirbt dir sonst die Ferien. Wir können dir eh nur sagen, was unserer Meinung nach nicht passt, nicht was er dachte.
Mit dem Setter (eigendlich müsste es Adder heißen ^^) setze ich z. B. nicht nur eine Variablenreferenz, sondern rufe eine Methode einer Unterklasse auf. Das verkürzt den Code (sonst müsste es ja #getWorkgroupList().add(Workgroup.getWorkgroup(name)) heißen, wenn man den null-Check ignoriert), und ich kann Dinge, die ich ansonst vergessen könnte, oder den "Ablaufteil" des Sources stören würde wie hier das synchronisieren machen.
Ich wollte damit eigentlich nur sagen dass es private Klassen gibt ;-)
Über den Nutzen eine Referenz auf eine Private Klasse zu haben müssen wir an dieser Stelle nicht nachdenken. Ich kann ja mit dem Objekt hinter der Referenz nicht viel anstellen, da ich die Klasse gar nicht kenne - aber das sprengt den Rahmen dieses Threads ...
Das ist so eine Art von Frage, bei der man die Vorteile von technisch-naturwissenschaftlichen Fächern (speziell: objektive Beurteilbarkeit der Antworten) ad absurdum führen kann, aber als Rechtfertigung (ausnahmsweise, für den Lehrer) : Man könnte kritisieren, dass der Sinn von gettern und settern nicht erklärt wurde. Dass (oder ob) da nun eine oder zwei Zeilen drin stehen und wie die rein syntaktisch aussehen ist "egal" (oder nicht so wichtig). Stichworte wie "Kapselung" oder "Veränderbarkeit einschränken" hätten vielleicht noch ein paar Pünktchen gebracht....
Das ist so eine Art von Frage, bei der man die Vorteile von technisch-naturwissenschaftlichen Fächern (speziell: objektive Beurteilbarkeit der Antworten) ad absurdum führen kann, aber als Rechtfertigung (ausnahmsweise, für den Lehrer) : Man könnte kritisieren, dass der Sinn von gettern und settern nicht erklärt wurde. Dass (oder ob) da nun eine oder zwei Zeilen drin stehen und wie die rein syntaktisch aussehen ist "egal" (oder nicht so wichtig). Stichworte wie "Kapselung" oder "Veränderbarkeit einschränken" hätten vielleicht noch ein paar Pünktchen gebracht....
Genau das dürfte der Punkt seien. Wir wissen hier alle nicht was ihr alles in eurer Vorlesung / Klasse so besoprochen habt, aber ich denke es geht hier auch um die Konzepte die du mit den Getter-/ und Setter-Methoden umsetzen kannst.
Getter bringen noch keine Kapselung (man denke nur an java.util.Date oder Collections), sorgen aber für "Information Hiding".
Bei JavaBeans darf man gar keine Immutables bauen, widerspricht der Spek (Setter müssen vorhanden sein).
Die Frage ist aber immer noch was der Lehrer hören wollte, egal wie richtig oder falsch es ist...