Rückgabe einer Kopie bzw. Referenz

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich hab in einem Buch ein Programm entdeckt das nachfolgende Methode enthält. Es wird gefragt wo die Vor- bzw. Nachteile liegen, wenn man nicht direkt die Referenz auf das Attribut position, sondern eine vollständige Kopie des zweidemensionalen Feldes (wird durch die eingebaute Methode clone realisiert) zurückliefert.

Könnt ihr mir sagen was die Vor- und Nachteile sind?

Code:
public int[][] getPositions()
{
    return (int [][]) position.clone()
}
 

Sky

Top Contributor
Nein. Das kommt auf die Anforderung an.

Wenn das "Ursprungs-Array" erhalten bleiben soll, so biste natürlich mit ner Kopie besser beraten (und umgekehrt)
 
G

Guest

Gast
Mal angenommen das Ursprungsarray darf sich nicht ändern wo wären denn dann Vor- bzw. Nachteile. Ich will im Prinzip nur verstehen wann es sinnvoll ist eine Referenz zurückzugeben und wann eine Kopie
 
G

Guest

Gast
mein Problem ist das ich nicht weiss worauf die in diesem Buch mit der Frage hinaus wollen.
 
G

Guest

Gast
Vielleicht kannst Du dir die Aufgabe 2 der folgenden Klausur mal anschauen und mir an diesem Beipiel sagen wo die Vor- bzw. Nachtteile sind. Das wäre sehr nett.

hier der Link: Klausur

login: i
password: studis
 

L-ectron-X

Gesperrter Benutzer
Wie wäre es, wenn du dich ein wenig selbst mit der Materie beschäftigst?
Wir machen hier keine Hausaufgaben, beantworten aber gerne konkrete Fragen. Ganz besonders, wenn wir erkennen können, dass sich der Fragende bemüht, mitdenkt und etwas lernen will.
Anderenfalls hast du keine gute Note verdient.
 
G

Guest

Gast
Grundsätzlich würde ich folgendes gelten lassen: Wird ein Objekt/Array etc. intern, innerhalb der Klasse,
die es liefert, verwendet, dann immer eine Kopie oder einen ImmutableWrapper zurückgeben, sonst direkt
die Referenz des Originals. Ausnahmen wären Frameworks, wo solche Kopierereien aus Performancegründen
nicht akzeptabel sind. Es sollte dann aber ausführlich dokumentiert werden.
 

André Uhres

Top Contributor
Wenn das Objekt eine Konstante sein soll, soll es immer immutable sein.
Wenn das Objekt oft geändert wird, sollte es mutable sein.
Wenn das Objekt sehr gross ist sollte es wahrscheinlich mutable sein, weil das Kopieren
das Programm langsamer macht.
Sets und andere collections die von einer Methode zurückgegeben werden sollten immutable sein
um die Kapselung zu bewahren.
 

Sky

Top Contributor
Anonymous hat gesagt.:
Grundsätzlich würde ich folgendes gelten lassen: Wird ein Objekt/Array etc. intern, innerhalb der Klasse,
die es liefert, verwendet, dann immer eine Kopie oder einen ImmutableWrapper zurückgeben, sonst direkt
die Referenz des Originals. Ausnahmen wären Frameworks, wo solche Kopierereien aus Performancegründen
nicht akzeptabel sind. Es sollte dann aber ausführlich dokumentiert werden.
Kannst Du das auch begründen ?
 
G

Guest

Gast
Sky hat gesagt.:
Anonymous hat gesagt.:
Grundsätzlich würde ich folgendes gelten lassen: Wird ein Objekt/Array etc. intern, innerhalb der Klasse,
die es liefert, verwendet, dann immer eine Kopie oder einen ImmutableWrapper zurückgeben, sonst direkt
die Referenz des Originals. Ausnahmen wären Frameworks, wo solche Kopierereien aus Performancegründen
nicht akzeptabel sind. Es sollte dann aber ausführlich dokumentiert werden.
Kannst Du das auch begründen ?
Gerne. Interna einer Klasse sollte man nicht nach aussen transportieren, da alles was ausserhalb einer Klasse
geschieht, aus Sicht der Klasse nicht kontrollierbar ist. Gibst du eine Arrayreferenz zurück, kannst du dich nie
darauf verlassen, was mit den Inhalten geschieht. z.B. es wird ausserhalb der Klasse umsortiert, während du
intern, in der Klasse, davon ausgehst, dass die Arrayelemente aufsteigend sortiert sind. Man könnte fragen,
wer macht solchen Blödsinn? Fehlerquellen auszuschliessen gehört zum guten Programmierstill.
Alternative: Innerhalb der Klasse immer für korrekte Sortierung sorgen. Folge: Unnötige Sortierung, wenn
sich nichts geändert hat.

Beispiel aus Swing. DefaultTableModel und die Methode getDataVector() (OK, die ist protected). Jeder zweite
Anfänger macht den Fehler, dass er sich nicht an die "Spielregeln" des Models hält und bei Änderungen
die fire.... Methode nicht aufruft. Ich habe schon bei Codereviews so manche Swing-Akrobatik erlebt, wo
jemand das Model nach Änderungen immer wieder neu gesetzt hat, damit die Änderungen wirksam werden.
 
G

Guest

Gast
Vielen Dank, auf so eine Antwort hab ich gehofft :lol:

Wie wäre es, wenn du dich ein wenig selbst mit der Materie beschäftigst?
Wir machen hier keine Hausaufgaben, beantworten aber gerne konkrete Fragen. Ganz besonders, wenn wir erkennen können, dass sich der Fragende bemüht, mitdenkt und etwas lernen will.
Anderenfalls hast du keine gute Note verdient.

Ich hab mich selbst mit der Materie beschäftigt. Wenn Du mal genauer geschaut hättest dann hättest Du auch gesehen das man meine konkrete Frage super beantworten kann (so wie besagter Gast). Der hat übrigens ne gute Note verdient ;-)
 

André Uhres

Top Contributor
Naja, ich zitiere mich mal selbst:
Andre_Uhres hat gesagt.:
Sets und andere collections die von einer Methode zurückgegeben werden sollten immutable sein
um die Kapselung zu bewahren.
In DefaultTableModel wäre daher dies wohl besser gewesen:
Code:
   public List getDataVector() {
        return Collections.unmodifiableList(dataVector);
    }
 

Bleiglanz

Gesperrter Benutzer
Andre_Uhres hat gesagt.:
Naja, ich zitiere mich mal selbst:
Andre_Uhres hat gesagt.:
Sets und andere collections die von einer Methode zurückgegeben werden sollten immutable sein
um die Kapselung zu bewahren.
[/code]
so pauschal ist das etwas gewagt, ich würde sagen dass das von der Anwendung abhängt (und ob das Objekt selbst überhaupt immutable sein soll)?

viele Objekte geben "intelligente" Collections zurück, d.h. solche die auf add / remove usw. einfach entsprechend reagieren (gerade im J2EE Umfeld ist das ziemlich weit verbreitet)
 

André Uhres

Top Contributor
Ich weiss nicht was du mit viele Objekte geben "intelligente" Collections zurück meinst.
In meinem Zitat meinte ich nicht Objekte, sondern den Rückgabewert von Methoden.
 

Bleiglanz

Gesperrter Benutzer
eine Methode gehört immer zu einem Objekt? und ob die in einer Methode zurückgelieferte Collection unveränderlich sein soll ist eben eine reine Designfrage

Code:
 Collection<Autor> autoren = buch.getAutoren()

es ist eben jetzt eine reine Implementierungsfrage, ob man zu der Liste "autoren" noch einen hinzufügen kann und damit den Zustand des "buch" Objekts verändert...
 
G

Guest

Gast
Andre_Uhres hat gesagt.:
Ich weiss nicht was du mit viele Objekte geben "intelligente" Collections zurück meinst.
In meinem Zitat meinte ich nicht Objekte, sondern den Rückgabewert von Methoden.
Damit meint er einfach spezielle Implementierungen von Collection (als Wrapper, Proxy oder was
weiss ich noch), die neben der offensichtlichen Funktionalität (add, remove etc.) noch paar andere
Aktionen im Hintergrund auslösen. Das kann irgendein ausgefallenes Event-Handling sein,
Transaktionskontrolle, Logging, Wasser kochen ;) usw.

In einem Extremfall, kannst Du eine komplette Datenbanktabelle als Collection "tarnen".
Du sagst z.B. add(person) und im Hintergrund wird es durch die Leitung gejagt, in Datenbank
geschrieben, der Aufruf wird geloggt, eine Message an FBI geschickt etc.
 

Bleiglanz

Gesperrter Benutzer
Encapsulation != Immutable

wenn Objekt x eine öffentliche Eigenschaft (get/set) vom Typ Collection hat, dann ist das eben so, wer will kann das so machen

wenn man das entsprechend "defensiv" programmiert - so dass äussere Änderungen an der Collection kein Problem verursachen - dann wird die "Kapselung" dadurch überhaupt nicht verletzt ??
 

André Uhres

Top Contributor
Bleiglanz hat gesagt.:
wenn Objekt x eine öffentliche Eigenschaft (get/set) vom Typ Collection hat, dann ist das eben so, wer will kann das so machen
wenn man das entsprechend "defensiv" programmiert - so dass äussere Änderungen an der Collection kein Problem verursachen - dann wird die "Kapselung" dadurch überhaupt nicht verletzt ??
Warum entsprechend "defensiv" prorgammieren wenn es mit immutable einfach und sicher geht?
 

Bleiglanz

Gesperrter Benutzer
a) weil immutable unter Umständen nicht praktikabel ist, denk mal an den Speicherverbrauch

b) weil manche Objekte eben einen Zustand haben, den man von aussen verändern kann, das ist die Quintessenz von OO :)

c) weil korrektes Programmieren eines immutable Objekts schwierig ist

Beispiel zu c)

ein
// in immutable Objekt
public java.util.Date getDate(){return this.date; // FALSCH }
jetzt MUSS der Programmierer wissen, dass "java.util.Date" mutable ist und also eine Kopie herstellen, d.h. im Endeffekt muss man für jede Property checken, ob das unterliegende Dings selbst einen veränderlichen Zustand hat usw. usf.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
karlmasutra Klassen Rückgabe eines Wertes aus einer anderen Klasse Java Basics - Anfänger-Themen 3
L Probleme bei Rückgabe eines Arrays in einer Methode Java Basics - Anfänger-Themen 47
I Rückgabe und Aufruf einer Methode innerhalb einer anderen Methode Java Basics - Anfänger-Themen 5
llabusch Methoden Rückgabe einer Methode verwerden Java Basics - Anfänger-Themen 1
D Rückgabe einer Klasse Java Basics - Anfänger-Themen 20
G Rückgabe einer Methoden bei Schließen des Fensters Java Basics - Anfänger-Themen 3
F Rückgabe eines Array´s aus einer Methode Java Basics - Anfänger-Themen 3
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
G Endlosschleife keine Rückgabe Java Basics - Anfänger-Themen 36
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
H Methode mit Array als Rückgabe This method must return a result of Type int[] Java Basics - Anfänger-Themen 2
Z Rückgabe eines Values in umgekehrte richtung Java Basics - Anfänger-Themen 5
M Rückgabe eines Arrays Java Basics - Anfänger-Themen 10
R Methode Rückgabe Java Basics - Anfänger-Themen 10
D Methode mit Übergabe double und Rückgabe String Java Basics - Anfänger-Themen 2
J Rückgabe-Problem Java Basics - Anfänger-Themen 10
B Rückgabe von zwei Werten: String und double Java Basics - Anfänger-Themen 14
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
J Funktionen auf der Rückgabe eines Stacks (pop) Java Basics - Anfänger-Themen 6
V Methoden Rekursive Methode mit String als Rückgabe Java Basics - Anfänger-Themen 7
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
S Rekursion Rückgabe - Türme von Hanoi Java Basics - Anfänger-Themen 16
F Konsolen Befehl ausführen und Rückgabe auswerten Java Basics - Anfänger-Themen 3
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
L Frage zur Rückgabe von Werten bei Methoden Java Basics - Anfänger-Themen 4
P Rückgabe erflogt nicht als Double Java Basics - Anfänger-Themen 2
D Methoden ArrayList Rückgabe bringt komische Werte Java Basics - Anfänger-Themen 12
M Übergabe / Rückgabe Java Basics - Anfänger-Themen 6
A Rückgabe in for-Schleife Java Basics - Anfänger-Themen 2
S Rückgabe-Array lässt sich nicht auslesen, LocalDate mit String Java Basics - Anfänger-Themen 3
G Methoden mehrdimonsionale Arrays als Rückgabe Java Basics - Anfänger-Themen 2
S Methode rückgabe wiederverwenden Java Basics - Anfänger-Themen 4
J Rückgabe als Wert, keine Referenz Java Basics - Anfänger-Themen 3
S Methoden void-Methode: Wieso gibt es eine Rückgabe? Java Basics - Anfänger-Themen 5
R public static void Rückgabe Java Basics - Anfänger-Themen 5
H Array wird verändert ohne Rückgabe? Java Basics - Anfänger-Themen 7
S Rückgabe von einem Array Java Basics - Anfänger-Themen 7
S Problem mit Rückgabe Wert von Methoden Java Basics - Anfänger-Themen 5
M Serialize - Fehler bei Rückgabe von Objekt Java Basics - Anfänger-Themen 5
R CMD Rückgabe durchlesen Java Basics - Anfänger-Themen 14
W Rückgabe Methode mit Feld Java Basics - Anfänger-Themen 4
A Rekursion in Baum und ArrayList als Rückgabe Java Basics - Anfänger-Themen 2
N Rückgabe der Werte funktioniert nicht Java Basics - Anfänger-Themen 9
F Problem bei Rückgabe von StringBuffer aus Methode Java Basics - Anfänger-Themen 6
N HashMap fehlerhafte Rückgabe Java Basics - Anfänger-Themen 7
K Problem mit der Rückgabe Java Basics - Anfänger-Themen 3
R Rückgabe Array Java Basics - Anfänger-Themen 22
G Klasse überschreiben wenn Rückgabe über Methode Java Basics - Anfänger-Themen 6
M Methode mit Rückgabe Java Basics - Anfänger-Themen 2
D Maximum Subarray Problem; Problem mit der Rückgabe Java Basics - Anfänger-Themen 10
N Methoden und deren Rückgabe Java Basics - Anfänger-Themen 4
H TreeMap Rückgabe - Compiler-Warnings Java Basics - Anfänger-Themen 9
M Rückgabe bei Exception Java Basics - Anfänger-Themen 4
H Rekursion und Rückgabe Java Basics - Anfänger-Themen 11
K Rückgabe aus Formular Java Basics - Anfänger-Themen 3
S HashMap: Rückgabe des key zu bestimmten value Java Basics - Anfänger-Themen 3
B "vollständige" Resultat Rückgabe Java Basics - Anfänger-Themen 8
G Problem mit der Rückgabe von einem Array Java Basics - Anfänger-Themen 3
A Beschreibung von Code und Rückgabe von Anzahl in ArrayList Java Basics - Anfänger-Themen 5
C Parameter rückgabe nach Prüfung an Klasse/Methode Java Basics - Anfänger-Themen 2
R Rückgabe vom ActionListener Java Basics - Anfänger-Themen 12
B JavaFilter true rückgabe Java Basics - Anfänger-Themen 23
S Rückgabe eines eingelesenen 2D Arrays aus Klasse heraus Java Basics - Anfänger-Themen 3
J datentyp -objectTyp Rückgabe Java Basics - Anfänger-Themen 2
zilti PHP-Script aufrufen und Rückgabe lesen Java Basics - Anfänger-Themen 2
G Array Rückgabe aus Programm Java Basics - Anfänger-Themen 6
0 Probleme bei Threads mit Rückgabe. Java Basics - Anfänger-Themen 6
C Rückgabe bei methoden Java Basics - Anfänger-Themen 2
S Probleme mit InputStream- Rückgabe Java Basics - Anfänger-Themen 4
G Warum ist die Rückgabe kein Integer? Java Basics - Anfänger-Themen 5
G Rückgabe Java Basics - Anfänger-Themen 6
G Rückgabe mehrdimensionales Array Java Basics - Anfänger-Themen 3
M Rückgabe funktioniert nicht! Java Basics - Anfänger-Themen 4
M Rückgabe oder Parameter? Java Basics - Anfänger-Themen 5
H Konstruktor mit Rückgabe Java Basics - Anfänger-Themen 13
L Rückgabe Java Basics - Anfänger-Themen 4
D Rückgabe von Arrays Java Basics - Anfänger-Themen 6
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
E Arrays in einer ArrayList miteinander vergleichen Java Basics - Anfänger-Themen 12
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
FunkyPhil94 Wert in einer Lambda Funktion erhöhen Java Basics - Anfänger-Themen 3
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
B Kommunikation mit Seriellen Schnittstellen + Integration einer lib Java Basics - Anfänger-Themen 1
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
T Fibonacci mit einer Hilfsmethode berechnen Java Basics - Anfänger-Themen 10
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
M Radius von einer ellipse bestimmen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben