Copy - Constructor vs clone()

Schuriko

Bekanntes Mitglied
Mir geht gerade die Frage durch den Kopf Copy-Constructor oder doch eher clone(). Im Prinzip machen es beide Funktionen ja gleich. Was bevorzugt ihr und warum?
 
Das Thema hatten wir neulich in einem anderen Thread und wenn man gegen Interfaces entwickelt, dann geht das mit dem clone() auch nicht mehr.
Wenn man z.B. mir ArrayLists arbeitet, dann hat man nach außen meist einfach ein List. Bei List hast du kein clone().
Der Konstruktor geht aber immer schön, da dieser einfach eine Collection nimmt.
 
Darf ich dazu nochmal etwas einwenden? Bei einem Copy-Constructor übergibt man eine Klasse zum kopieren. D.h. im Programm selbst könnte auch null übergeben werden, was theoretisch absolut legitim wäre, allerdings zu keiner kopie führen kann. Bei einem clone() würde ja schon die instanzierte Klasse zurückgegeben.
 
Darf ich dazu nochmal etwas einwenden? Bei einem Copy-Constructor übergibt man Klasse zum kopieren. D.h. im Programm selbst könnte auch null übergeben werden, was theoretisch absolut legitim wäre, allerdings zu keiner kopie führen kann. Bei einem clone() würde ja schon die instanzierte Klasse zurückgegeben.
Bei einem clone würde dann eine NPE fliegen, bei einem Copy-Construktor kann man wenn möglich dann sinnvolle Default-Werte setzen.
 
Ich habs mal in meinem Projekt umgesetzt. Hierbei ist mir doch noch eine Frage bezüglich Copy-Constructor eingefallen. Wie würdet ihr vorgehen, bei einer Klasse. Also zum besseren Verstehen: Angenommen in der übergebenen Klasse befindet sich eine Instanz einer anderen Klasse z.B. wie folgt
Code:
class ClassA {
     ....
}

class ClassB {
    private ClassA;
    
    public ClassB(ClassB b) {
        ....
    }
}

würdet ihr dann in dem Konstruktur von ClassB eine neue Instanz von ClassA erzeugen. Oder würdet ihr die Klasse einfach so übernehmen? Denn angenommen die Instanz ClassA wird an einer Instanz von ClassB eingefügt werden, weil dann würde doch wenn ich die Instanz ClassA aus einem der beiden Klassen B lösche auch für die andere Instanz nicht mehr zur Verfügung stehen.
 
würdet ihr dann in dem Konstruktur von ClassB eine neue Instanz von ClassA erzeugen. Oder würdet ihr die Klasse einfach so übernehmen?
Kommt drauf an, manchmal braucht man eine tiefe Kopie, machmal eine flache. Pauschal lässt sich das nicht entscheiden, meist reicht aber eine flache.

Denn angenommen die Instanz ClassA wird an einer Instanz von ClassB eingefügt werden, weil dann würde doch wenn ich die Instanz ClassA aus einem der beiden Klassen B lösche auch für die andere Instanz nicht mehr zur Verfügung stehen.
Keine Ahnung ob ich dich richtig verstehe, aber solange eine Instanz irgendwo noch benötigt wird, wird sie nicht gelöscht.

Wenn zwei Instanzen von B auf das gleiche A zeigen (B1-->A<--B2), ist egal wie sich eines der Bs ändert, weder ein löschen von A in einer Instanz (B1, B2-->A) ändert was an der anderen, noch wenn man ein zweites A einführt (B1-->A1, B2-->A2).
 
Kommt drauf an, manchmal braucht man eine tiefe Kopie, machmal eine flache. Pauschal lässt sich das nicht entscheiden, meist reicht aber eine flache.


Keine Ahnung ob ich dich richtig verstehe, aber solange eine Instanz irgendwo noch benötigt wird, wird sie nicht gelöscht.

Wenn zwei Instanzen von B auf das gleiche A zeigen (B1-->A<--B2), ist egal wie sich eines der Bs ändert, weder ein löschen von A in einer Instanz (B1, B2-->A) ändert was an der anderen, noch wenn man ein zweites A einführt (B1-->A1, B2-->A2).
Stimmt, daran hatte ich gar nicht gedacht. War wohl gestern abend schon zu spät. DANKE!
 

Zurück
Oben