Anfängerfrage veränderbare Objekte

schiese

Erfahrenes Mitglied
Hallo,
ich habe in meinem Lehrbuch den Satz "Achten Sie darauf, keine Zugriffsmethoden zu schreiben, die Referenzen auf veränderbare Objekte zurückgeben." gelesen. Als Beispiel wird nur gesagt, z.B. ein Objekt der Klasse Date.

Habe jetzt mal eine einfache Beispielklasse:

import java.util.*;
public class Test {

public Test(int jahr, int monat, int tag) {
GregorianCalendar kal = new GregorianCalendar(jahr, monat-1, tag);
this.tag = kal.getTime();
}

public Date getTag() {
return tag;
}

public static void main(String[] args) {
Test t1 = new Test(2007, 7, 26);
System.out.println(t1.getTag());
}

private Date tag;

}

Wieso sollte man das besser lassen.

Danke schiese
 
Hallo,

denke, dass die Aussage grundsätzlich einmal übertrieben ist. Manchmal ist es gewünscht, nur Referenzen zurückzugeben damit eine andere Klasse damit arbeiten kann.
Als Beispiel hier die Methode getContentPane() von einem JFrame, welche dir den sichtbaren Bereich des Fensters zurückgibt.

Jedoch würde es ja grundsätzlich der Sichtbarkeit wiedersprechen, wenn man private-Objekte über eine public-Get-Methode abrufen könnte.

Von daher denke ich, dass man Grundsätzlich dem Ansatz folgen sollte, es jedoch auch nicht schlimm ist, wenn man ihn unter gegebenen Umständen bricht.

Gruß
BK
 
Zuletzt bearbeitet:
Vielen Dank für deine Antwort.
Ich hätte gedacht, dass es damit was zu tun hat, dass sich nachher mehrere Sachen aufs selbe Objekt beziehen und so Probleme entstehen können.
Werde den Abschnitt dann erst einmal überspringen.

schiese
 
Ich hab den Satz mal gegooglet und bin darauf gestoßen: klick
Ich sag mal so: Es kommt drauf an, aber als Grundsatz würde ich das nicht verbuchen. In dem Beispiel der verlinkten Seite stimme ich dem Satz zu. Allerdings ist das ein Fall, wo man in der Regel automatisch explizit einen Klon erstellen würde, z.B. indem man ein neues Date-Objekt mit dem Timestamp des alten füttert. In der OOP ist es nunmal so, dass man Referenzen verwendet und mehrere Variablen nunmal auf das selbe Objekt verweisen können, das ist auch sinnvoll. Wozu soll man bei jeder Parameter-Übergabe oder Funktions-Rückgabe eine Kopie weiterreichen, damit stopft man nur den RAM und verschwendet Rechenleistung.

Wie gesagt, das hängt vom Fall ab und ich denke auch nicht, dass der Autor das wirklich ernst meinte. Ich denke eher, dass das ein Hinweis für Neulinge ist und sagen will: "Hey, pass mal auf. Wenn du eine Referenz weiterreichst und in dieser Daten änderst, dann werden in allen anderen Referenz-Variablen die Änderungen genauso wirksam, weil sie alle auf das selbe Objekt (bzw. die selbe Speicherstelle) verweisen und somit alle Referenzen davon betroffen sind."
 
Kleiner Einwurf:
Was bei String (und Date) zum Beispiel umgesetzt wird ist das immutable Pattern (oder wie das heißt). Daher eine Klasse die man nicht mehr ändern kann, sondern nur beim Initialisieren die Werte bestimmt.
Dabei braucht man Dinge wie der hashCode nur einmal berechnen.
 
Zurück