Rückgabe als Wert, keine Referenz

jGhost

Mitglied
Hallo Community,

wie gibt man bei Java den Rückgabewert so zurück, dass er keine Referenz mehr ist.

Das Java-Methoden immer Werte zurück geben und auch an nehmen und keine Referenzen wie bei C/C++ habe ich schon gegoogelt und auch verstanden.

Folgendes Beispiel:
Java:
package test;

import java.awt.Point;

class MyClass{
    private Point point;
    
    public MyClass(){
        point = new Point(10, 10);
    }
    
    public Point getPoint(){
       return point;       
    }
}

public class test{    

    public static void main(String[] args) {
        // TODO code application logic here
        
       MyClass myClass = new MyClass();
       
       System.out.println(myClass.getPoint());
       System.out.println();
       
       Point point2 = myClass.getPoint();
       point2.x = 100;
       
       System.out.println(myClass.getPoint());        
    }    
}

In Zeile 28 kann ich auf ein (private) Eigenschaft der Klasse zugreifen und verändern, über die Ausgabe. Wie kann ich das so ausgeben dass die Eigenschaft sicher ist.

Möglchkeit die ich gefundne habe:
Java:
    public Point getPoint(){
   return new Point(point);
}

Und was macht man bei einer Liste, soll die auch neu erstellen werden, ist das nicht zuviel Code?
Java:
class Turtle{
    private List<Point> shape;
    ...

    public List<Point> getShape(){
        ....
    }
}

Sorry für die Frage, bin neu bei Java, und Google gibt auch keine Antwort 😀.
 
public Point getPoint(){
return new Point(point);
}

Eine Klasse nennt man, wenn alle Operationen, die den Zustand ändern können, dies durch eine Rückgabe eines neuen Objektes bewerkstelligen, immutable.

Bei Collections (also auch Listen) geht das, indem man quasi eine unveränderbare Sicht liefert.
Java:
List unmodifiableList = Collections.unmodifiableList(aList);
 
Ich will ja den Rückgabewert (später) verändern aber nicht die Eigenschaft des Objekts.

Ich zeichne ein Dreieck.
1. Die Koordinaten hole ich mir von dem Objekt (Dreieck).
2. Den Grad-Wert hole ich auch von dem Objekt (Dreieck).
2. Lasse sie dann rotieren. (Koordinaten werden verändert)
3. Anschliessend zeichne ich sie.

In meinem Fall will ich aber, dass die Koordinaten des Objekts nicht verändert werden, nur die Gran-Eigenschaft soll sich ändern. Die Koordinaten ändern sich schon, aber nur für die Zeichnung, bei der nächsten Zeichnung will ich wieder die Original-Koordinaten.

Das Porgramm ist mir nicht wichtig, ich könnte es auch anders lösen. Hab blos festgestellt dass mit dem Rückgabewert eines Obekts man diese Eigenschaft auch (indirekt) ändern kann auch wenn sie "private" ist. Bei C/C++ oder z.B. PHP geht das ja so nicht. Und deswegen interessiert es mit wie man in diesem Fall vorgeht: Der Rückgabewert (einer Eigenschaft) soll sich ändern aber die Eigenschaft selbst des Objektes nicht.
 
Eine Möglichkeit wäre, dass deine getPoint Methode eine Kopie zurück gibt.(z.B. mit new Point(point) oder mir point.clone)
Die andere Option, die gerade bei mathematischen Grössen oder auch geometrischen Figuren besonders vorteilhaft ist, wäre deine Klasse immutable zu machen. Das heisst ein verändern ist grundsätzlich nicht möglich. Statt dessen liefert dann z.B. die "rotieren" Methode ein neues Objekt zurück.

Für Listen kann man diese Strategie auch gut anwenden, wenn man "persistente Datenstrukturen" verwendet. z.B. eine einfach verlinkte Liste. Da kann man dann sehr leicht eine veränderte Kopie erstellen ohne das Original zu verändern und ohne die Liste kopieren zu müssen, da sich die beiden Listen die Daten im Arbeitsspeicher teilen.
 

Neue Themen


Zurück
Oben